Коммивояжер с несколькими коммивояжерами?

У меня есть проблема, которая была фактически сведена к задачи коммивояжера с несколькими продавцами. У меня есть список городов для посещения из первоначального местоположения, и я должен посетить все города с ограниченным количеством продавцов.

Я пытаюсь придумать эвристику и задавался вопросом, Может ли кто-нибудь помочь. Например, если у меня есть 20 городов с 2 продавцами, подход, который я думал брать в 2 этапа. Во-первых, разделите 20 городов случайным образом в 10 городов по 2 продавца каждый, и я бы нашел тур для каждого, как если бы он был независимым для нескольких итераций. После этого я хотел бы поменять или назначить город другому продавцу и найти тур. Фактически, это была бы TSP и то минимальные проблемы период изготовления. Проблема в том, что это будет слишком медленное и хорошее соседство поколения замены или назначения города трудно.

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

EDIT:

геолокация для каждого города известна, и продавцы начинаются и заканчиваются в одних и тех же местах. Цель состоит в том, чтобы минимизировать максимальное время, делая такого рода задачи период изготовления. Так, например, если salesman1 занимает 10 часов, а salesman2-20 часов, максимальное время в пути составит 20 часов.

8 ответов


TSP-сложная проблема. Multi-TSP, вероятно, намного хуже. Я не уверен, что вы можете найти хорошие решения с помощью таких специальных методов. Вы пробовали мета-эвристические методы ? Сначала я попробую использовать метод перекрестной энтропии : его не должно быть слишком сложно использовать для вашей проблемы. В противном случае ищите общие алгоритмы, оптимизацию колонии муравьев, имитацию отжига ...

см. "учебник по методу Кросс-энтропии" из Boer et al. Они объясняют, как использовать метод CE на ЧАЙНАЯ ЛОЖКА. Простой адаптацией для вашей проблемы может быть определение другой матрицы для каждого продавца.

вы можете предположить, что вы хотите найти оптимальное разделение городов между продавцами (и делегировать кратчайший тур для каждого продавца классической реализации TSP). В этом случае в настройке перекрестной энтропии вы рассматриваете вероятность того, что каждый город Xi окажется в туре продавца A : P(Xi в A) = pi. И вы работаете, на пространстве p = (p1, ... pn). (Я не уверен, что он будет работать очень хорошо, потому что вам придется решать многие проблемы TSP.)


Я бы не стал писать алгоритм для такой сложной проблемы (если это не моя дневная работа - писать алгоритмы оптимизации). Почему бы вам не обратиться к общему решению, такому какhttp://www.optaplanner.org/ ? Вы должны определить свою проблему, и программа использует алгоритмы, которые лучшие разработчики потратили годы на создание и оптимизацию.


когда вы начинаете говорить о нескольких продавцов, я начинаю думать об оптимизации роя частиц. Я нашел много успехов в этом, используя алгоритм гравитационного поиска. Вот (длинный) документ, который я нашел, охватывающий эту тему. http://eprints.utm.my/11060/1/AmirAtapourAbarghoueiMFSKSM2010.pdf


Почему бы вам не преобразовать несколько TSP в традиционный TSP?
Это хорошо известная проблема (преобразование нескольких продавцов TSP в TSP), и вы можете найти несколько статей по ней.

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

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


моей первой мыслью при чтении описания проблемы было бы использовать стандартный подход к проблеме продавца (поиск подходящего, поскольку мне никогда не приходилось писать код для него); затем возьмите результат и разделите его пополам. Ваш алгоритм тогда может быть, чтобы решить, где "половина" - может быть, это половина городов, или, может быть, это основано на расстоянии, или, может быть, какая-то комбинация. Или найдите результат для наибольшего расстояния между двумя городами и выберите это как разделение между последним городом продавца №1 и первым городом продавца № 2. Конечно, это не ограничивается двумя продавцами, вы бы разбились на x частей; но в целом идея заключается в том, что ваше стандартное решение 1 продавца TSP должно было уже получить "близлежащие" города рядом друг с другом в графике путешествий, поэтому вам не нужно придумывать отдельный алгоритм группировки...

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


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


Как указано в ответе выше решение иерархической кластеризации будет работать очень хорошо для вашей проблемы. Вместо того чтобы продолжать распускать кластеры до тех пор, пока у вас не будет единого пути, остановитесь, когда у вас есть n, где n-количество продавцов, которые у вас есть. Вероятно, вы можете улучшить его, добавив некоторые "поддельные" остановки, чтобы повысить вероятность того, что ваши кластеры окажутся на равном расстоянии от исходного пункта назначения, если исходные кластеры слишком разрозненны. Это не оптимальный-но вы не получите оптимальное решение для такой проблемы. Я бы создал приложение, которое визуализирует проблему, а затем тестирует множество вариантов решения, чтобы почувствовать, достаточно ли оптимальна ваша эвристика.

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


только начав читать ваш вопрос, используя генетический алгоритм пришел мне в голову. просто используйте два генетических алгоритма в то же время один может решить, как назначить города продавцам, а другой может решить TSP для каждого продавца у вас есть.