Справка по алгоритму проблем с доставкой и доставкой - PullRequest
4 голосов
/ 08 мая 2011

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

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

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

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

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

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

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

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

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

Ответы [ 2 ]

1 голос
/ 09 мая 2011

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

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

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

1 голос
/ 09 мая 2011

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

...