java — реализация определенного варианта коммивояжера

Я ищу алгоритм (C / C ++ / Java — не имеет значения), который решит проблему, состоящую в поиске кратчайшего пути между 2 узлами (A и B) графа. Подвох в том, что путь должен посещать определенные другие заданные узлы (города). Город можно посетить не раз. Пример пути (-Н-Д-С-Е-FгFВ) (где A — источник, B — пункт назначения, F и G — города, которые необходимо посетить).

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

Я пытался найти решение, начиная с этих тем, но безуспешно:
https://stackoverflow.com/questions/24856875/tsp-branch-and-bound-implementation-in-c а также
Вариация TSP, которая посещает несколько городов

1

Решение

Простое сокращение проблемы до TSP будет:

  1. Для каждого (u,v) что «надо посетить», найдите расстояние d(u,v) между ними. Это можно сделать эффективно, используя Алгоритм Флойда-Варшалла найти кратчайший путь для всех.
  2. Создайте новый граф G ‘, состоящий только из этих узлов, со всеми существующими ребрами, с расстояниями, рассчитанными по (1).
  3. Запустите стандартный алгоритм TSP для решения задачи на приведенном графе.
1

Другие решения

Я думаю, что в дополнение к ответу amit, вы захотите увеличить стоимость ребер с A или B в качестве конечных точек на достаточную величину (общая стоимость графика + 1, вероятно, будет достаточно), чтобы гарантировать, что вы надеваете не заканчивается путь, который проходит через A или B (вместо того, чтобы заканчиваться в A и B).

A--10--X--0--B
|      |     |
|      10    |
|      |     |
+---0--Y--0--+

Приведенный выше случай приведет к пути от A до Y к B к X, если только вы не увеличите стоимость ребер A и B (на 21).

A--31--X--21--B
|      |      |
|      10     |
|      |      |
+---21--Y--21-+

Теперь он идет от А к Х к Y к Б.
Также убедитесь, что вы удалили все ребра (A, B) (если они существуют).

0

По вопросам рекламы [email protected]