Конструктивная эвристика коммивояжера

Скажем, у нас есть круговой список, представляющий решение задачи о коммивояжере. Этот список изначально пуст.

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


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

Какие еще есть варианты (псевдокод, если возможно).


person Fatso    schedule 07.01.2012    source источник
comment
Вам не нужно давать мне код. Если бы это было домашнее задание, я бы попросил код, мне он не нужен. Просто хочу оптимизировать свое приложение и посмотреть, какие у меня есть варианты.   -  person Fatso    schedule 07.01.2012


Ответы (3)


Вы, конечно, можете обобщить идею, которую вы упомянули:

Определить k'th_path(v) = minimum weight of a path including max{k,not_visited cities} cities

Обратите внимание, что вычисление k-го пути равно O(|V|^k) [эта граница не точна]

Особые случаи:

  • За k=1 вы получаете ближайшего соседа, как вы предложили.
  • для k=|V| вы получите оптимальное решение [обратите внимание, что его будет очень сложно вычислить].
person amit    schedule 07.01.2012
comment
Спасибо, амит!! Это именно тот ответ, который я искал: никакого кода, просто объяснение эвристики. Не могу отблагодарить вас достаточно. - person Fatso; 07.01.2012

Существует множество эвристик построения, которые вы можете использовать, такие как «Первое соответствие», «Уменьшение первого соответствия», «Наилучшее соответствие», «Уменьшение наилучшего соответствия» и «Самая дешевая вставка». Эти эвристики построения обычно применяются при упаковке контейнеров, но их также можно преобразовать в TSP. Документация об этих эвристиках здесь.

Поскольку вы вставляете только 1 неназначенный объект за раз, все они в основном возвращаются к тому, что вы называете эвристикой ближайшего соседа (с небольшим изменением связей), но обратите внимание, что это не то, что они обычно делают. вызов ближайшего соседа. Ближайший сосед всегда добавляет в конец строки ближайшего соседа всех неназначенных объектов.

Теперь то, что вам действительно нужно, — это достойное решение без необходимости перезапуска всей эвристики построения. Это сложнее: добро пожаловать в повторяющееся планирование и в реальном времени планированиеэту документацию). Я работаю над примером с открытым исходным кодом для TSP и маршрутизации транспортных средств, который выполняет планирование в реальном времени.

person Geoffrey De Smet    schedule 07.01.2012
comment
Я не думаю, что он (Корион) понимает это. - person Gigamegs; 07.01.2012
comment
Потому что ты этого не понимаешь, Дэвид :D? Спасибо, Джеффри! - person Fatso; 08.01.2012

Других эвристик нет, потому что TSP всегда стремится найти ближайшую координату. По крайней мере, я не знаю алгоритма, который может вставить координату и знает ближайшую координату, но есть много алгоритмов, чтобы найти хороший тур. Хорошей эвристикой является, например, алгоритм Кристофидеса, он работает только в евклидовом пространстве, но гарантирует, что решение будет в пределах 3/2 от оптимального. Кодить не очень легко. В частности, алгоритм Эдмонда Блума v предназначен для экспертных навыков. Важность гарантии недостаточно высока, потому что как бы вы объяснили, что ваш метод может привести к абсурду в какой-то редкой ситуации?

person Gigamegs    schedule 07.01.2012
comment
Других эвристик нет? Я сомневаюсь. Любые ресурсы для этого требования? - person amit; 07.01.2012
comment
@amit: Есть много эвристик, чтобы найти хороший тур, но ни один из них не работает с методом вставки, или, может быть, я просто не понимаю его вопроса. - person Gigamegs; 07.01.2012
comment
Есть и другие эвристики, Дэвид. Самая дальняя вставка, самая дешевая вставка. - person Fatso; 08.01.2012
comment
@Korion: Я действительно не знаю, почему ты так счастлив. Ваш вопрос действительно расплывчатый. Я даю вам ответ, а также очень хорошую эвристику. - person Gigamegs; 08.01.2012
comment
Почему ты такой злой? Вы голосуете против всех хороших ответов здесь без причины ... Я мог бы перефразировать свой вопрос для вас, но я не вижу смысла: я получил нужные мне ответы. - person Fatso; 08.01.2012
comment
Хотя Christofides - хорошая эвристика. Я бы проголосовал за вас, если бы вы не проголосовали за всех остальных. - person Fatso; 08.01.2012