Задача комивояжера

Допустим есть агентство курьерских услуг по городу. Пусть есть 5 курьеров. Метро, автобусы и курьеры ходить пешком тоже умеют Каждый курьер должен съездить в несколько мест.

Вопрос — КАК проложить оптимальный (по времени (в первую очередь) и деньгам) маршрут? (алгоритм). Да это задача комивояжера, но немного измененная.

Хотелось бы чтобы программа отправила курьера с ветки на ветки метро на автобусе за 10 минут и 20 рублей, а не на метро через центр за 40 минут и 19 рублей.

т.е. есть список метро и адрес куда отвести (метро привязано к адресу). Есть 5 курьеров и 25 передач которые нужно вести (по 5 на каждого). Нужно каждому курьеру передать 5 передач чтобы время и стоимость были оптимальны. Ну и вес туда, же.

Как представлю что это такое… становится не по себе. Уже морально готов к полному перебору, но не могу пока придумать алгоритм
  • Вопрос задан
  • 2872 просмотра
Решения вопроса 1
kekekeks
@kekekeks
Прикинул. В общем, вам нужно где-то раздобыть списки маршрутов и вытащить откуда-нибудь карту метро. После чего вам понадобится построить полный граф стоимостей перемещения с каждой остановки на каждую. Это делается один раз. Потом, когда распределяете посылки, надо будет найти опять же кратчайшие маршруты между точками следования, используя предворительно подготовленный граф цен перемещений. И уже по этому графу точка-точка делать полный перебор. Ресурсов сожрать много не должно, да и у нас не олимпиада, когда надо в секунду уложиться. Как-то вот так.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 4
kekekeks
@kekekeks
У вас каких-то 25 передач и 5 курьеров. На таких объёмах можно смело использовать полный перебор и не заморачиваться. Единственное, постройте полный граф цен перемещения от каждой точки до каждой.
Ответ написан
kekekeks
@kekekeks
После чего для каждую точку назначения привязываем к 3 ближайшим станциям. И ищем кратчайшие пути от каждой точки до каджой + до пункта отправки. И уже на основании этих данных можно рисовать полный перебор возможностей. Как-то вот так.
Ответ написан
Комментировать
@MiniM
Ещё нужно определиться с весовой функцие время-деньги — в любом случае по двум критериям оптимизация не делается и тут есть два пути:
1) ставить один из критериев в ограничение, например не дольше чем за день доставиться все посылки
2) ввести весовую функцию, но тут необходимо отнормировать время и деньги, например время к количеству часов в рабочем дне, а стоимость к максимальному бюджету курьера.
Ответ написан
Комментировать
eternals
@eternals
Перебором, конечно. И как написали выше, с применением «динамического программирования», т.е. запоминать и использовать уже рассчитанные варианты и подварианты.

В реальной жизни такие задачи стараются решать зональным способом. А для Москвы и, наверное, Питера в виде секторов вокруг веток метро. Чтобы в секторе было удобно перемещаться. Сектора могут немного накладываться друг на друга. Затем для леммингов подбираете маршрут исходя из предпочтения находиться в одном секторе или максимум смежных. Ну и количество точек учитываете. Можно далее учесть и их отдалённость и последовательность обхода задать.

Просто решать перебором на полной карте — это строить ветки метро, наземного транспорта, учитывать водные преграды, сраные железнодорожные пути, пробки, стоимость проезда сложнее высчитать. В итоге вы одного курьера на 50% будете использовать, а другого на 150%.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы