Путешествующий продавец с несколькими продавцами?

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

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

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

РЕДАКТИРОВАТЬ:

Геолокация для каждого города известна, и продавцы начинают и заканчивают в тех же местах. objective состоит в том, чтобы свести к минимуму максимальное время движения, что делает эту проблему минимальной проблемой. Например, если продавец 1 занимает 10 часов, а продавец 2 занимает 20 часов, максимальное время в пути – 20 часов.

TSP – сложная проблема. Multi-TSP, вероятно, намного хуже. Я не уверен, что вы можете найти хорошие решения с помощью специальных методов, подобных этому. Вы пробовали метаэвристические методы? Сначала я попытаюсь использовать метод Cross Entropy: его не должно быть слишком сложно использовать для вашей проблемы. В противном случае ищите Generic Algorithms, Ant Colony Optimization, Simulated Annealing …

См. «Учебное пособие по методу кросс-энтропии» от Boer et al. Они объясняют, как использовать метод CE в TSP. Простая адаптация для вашей проблемы может заключаться в определении другой матрицы для каждого продавца.

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

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

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

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

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

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

Моей первой мыслью по чтению описания проблемы было бы использование стандартного подхода для проблемы продавца (поиск в Google для подходящего, поскольку мне никогда не приходилось писать код для него); Затем возьмите результат и разделите его пополам. Тогда ваш алгоритм мог бы решить, где «половина» – может быть, это половина городов, или, может быть, она основана на расстоянии или, может быть, в некоторой комбинации. Или найдите результат на самом большом расстоянии между двумя городами и выберите это как расстояние между последним городом Продавца №1 и первым городом продавца №2. Конечно, это не ограничивает двух продавцов, вы бы вломились в х штук; Но в целом идея заключается в том, что ваше стандартное решение TSP для продавцов уже должно было получить «близлежащие» города рядом друг с другом на графике путешествия, поэтому вам не нужно придумывать отдельный алгоритм группировки …

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

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

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

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

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

  • Как «застегнуть» или «повернуть» переменное количество списков?
  • Big O при добавлении разных подпрограмм
  • Как найти список возможных слов из матрицы букв
  • Как восстановить приоритет PriorityQueue до его начального состояния перед вызовом метода?
  • Эффективно изменить порядок слов (не символов) в массиве символов
  • Как найти самый низкий общий предк двух узлов в любом двоичном дереве?
  • Что может привести к сложности алгоритма O (log n)?
  • каков самый быстрый способ найти gcd из n чисел?
  • Как найти k-й наибольший элемент в несортированном массиве длины n в O (n)?
  • Как найти дублирующий элемент в массиве перетасованных последовательных целых чисел?
  • Лучший алгоритм для поиска следующего палиндрома числовой строки
  • Давайте будем гением компьютера.