Справка по алгоритму проблемы с самовывозом и доставкой

Предположим, доставка еды для нескольких ресторанов (скажем, 20). Доступно (скажем, 10) драйверов. Далее, допустим, мы получаем 100 заказов за 4 часа на доставку еды из этих ресторанов на дом.

Таким образом, водители должны координировать свои действия, чтобы забирать еду в определенном месте и доставлять ее клиентам на дом.

Основная цель — минимизировать время до доставки, то есть время между заказом и прибытием на дом. Второстепенная цель — максимизировать пропускную способность водителей (т. е. как можно меньше времени для доставки всех заказов).

Имейте в виду, что заказы приходят в течение четырех часов, поэтому, скажем, равномерно, то есть один очень 3 минуты. Кроме того, предположим, что заказы поступили случайным образом в 20 ресторанов.

Предположим, что я могу рассчитать время, необходимое для путешествия из любого места в пункт назначения с точностью до секунды.

Я знаю местонахождение всех водителей в режиме реального времени. Я также знаю их статусы, т.е. находятся ли они сейчас в пути, чтобы забрать заказ (доставить в известное место назначения), они уже получили заказ и находятся в пути в известное место назначения.

Ограничения: 1) Должен забрать заказ после заданного времени (т. е. время приготовления еды для ресторана) 2) Должен доставить заказ менее чем за 45 минут (в противном случае выдается предупреждение) 3) Необходимо добавить время с «x» минут, чтобы приспособиться к времени время, потраченное на прогулку до магазина, чтобы забрать заказ и т. д. 4) Время, затраченное на доставку заказа покупателю и получение оплаты, должно быть дополнено «y» минутами. 5) У водителей есть только определенный набор способов оплаты (например, наличные, Visa, Amex, MasterCard). Мы должны сопоставить запрос клиента (наличные, виза и т. д.) с возможностями водителя (наличные, виза, амекс и т. д.).

Так, например, если я получаю два заказа с ближайшим пунктом назначения и ближайшим к пункту выдачи, даже если есть еще один «бесплатный» водитель (ничего не делающий), было бы более эффективно использовать одного и того же водителя для получения обоих заказов и доставки. оба заказа.

Вы можете предположить, что для каждого ресторана будут установлены зоны доставки, а это означает, что большинство людей, которые заказывают у них, скорее всего, будут рядом с ними. Таким образом, этот алгоритм должен автоматически сегментировать водителей на городские зоны и отдавать предпочтение водителям, уже находящимся в пределах зоны.


person pmah    schedule 08.05.2011    source источник


Ответы (2)


Это похоже на онлайн-версию проблемы выбора маршрута транспорта с временными окнами. Я предлагаю вам использовать Google и читать статьи, которые появляются.

person Robin Green    schedule 08.05.2011

Это зависит от того, сколько времени вы потратили на разработку самого алгоритма (не считая графического интерфейса, оповещений и всего такого).

  • Если вы говорите об 1 или 2 днях, воспользуйтесь детерминированным алгоритмом: поместите заказы в стек FIFO, затем итеративно возьмите следующий заказ и назначьте его первому доступному драйверу. Примерно так это делают люди. Это также не очень эффективно (особенно с 3 или более ресторанами).
  • Если у вас есть больше времени (потому что вы решаете эту проблему для большой компании), то начинается самое интересное. Изучите метаэвристику (поиск с запретами, генетические алгоритмы, имитация отжига). Взгляните на существующие библиотеки, чтобы сделать большую часть работы за вас. Например, если вы работаете с Java, взгляните на Drools Planner.

Кстати: если вы думаете о грубом форсировании. Не беспокойтесь: он не будет масштабироваться.

person Geoffrey De Smet    schedule 09.05.2011
comment
Спасибо! Как вы думаете, брут заставит работать для небольшого корпуса, скажем, 5 драйверов? Я искал что-то хорошее для python. Я нашел омета. Есть ли у вас какие-либо другие предложения для python? - person pmah; 12.05.2011