Я реализую алгоритм, который находит оптимальный гамильтонов путь в ориентированном графе. Я реализовал алгоритм, который, кажется, работает достаточно хорошо, однако я не совсем уверен, есть ли в некоторых случаях незначительные ошибки или другие проблемы. Поэтому мне нужно несколько разноплановых сетей, в которых известно решение, чтобы проверить, решает ли моя реализация их также, как и должно.
Поскольку в Википедии подразумевается, что гамильтоновы пути являются только подходящим термином для неориентированных графов, предположим, что «гамильтоновый путь» означает путь, который посещает каждый узел один и ровно один раз в данной сети, направленный или иным образом.
Для простоты мы можем предположить, что каждое соединение (или «ребро») имеет положительное целочисленное значение (или «длину»). Мы также можем предположить, что ни один узел не связан с самим собой, и между любыми двумя узлами может быть не более одного ребра в каждом направлении.
Меня интересует путь, который имеет наибольшую общую длину, поэтому «оптимальный» означает самый длинный, хотя это, вероятно, не имеет большого значения, если бы я хотел самую короткую общую длину (как в традиционном TSP). Я также использую жадный алгоритм.
Где или как я могу получить направленные сети, для которых был решен TSP? Было бы еще лучше, если бы существовало реальное и жадное (или другое эвристическое) решение. Сети должны быть достаточно большими, чтобы проводить информативный тест, но достаточно маленькими, чтобы я мог вручную проверить решение (если решение изначально неизвестно). Они должны быть достаточно топологически разнородными, чтобы охватить как «простые», так и «проблемные» сети.
Для тех, кто ищет то же самое; лучшее, что у меня есть, это следующая сеть:
A B C D E
A 0 1 2 0 1
B 1 0 0 0 1
C 0 3 0 1 2
D 4 0 0 0 0
E 1 0 0 2 0
Это список смежности, строки - начало границ, а столбцы - места назначения. Числа являются длинами каждого ребра, а 0 указывают на отсутствие ребра. Например, 4 показывает, что длина ребра от D до A равна 4, и нет соединения от A до D (длина 0).
Максимальная длина пути в этой сети E-> D-> A-> C-> B. Его общая длина составляет 2 + 3 + 3 + 3 = 11. Я полагаю, что жадный алгоритм способен найти лучшее решение в этом случае, и оказывается очевидным, что он является наилучшим из возможных решений.