测试Hamiltonian Path finder实现

时间:2012-01-12 15:35:17

标签: testing benchmarking graph-theory traveling-salesman hamiltonian-cycle

我正在实现一种在有向图中找到最优哈密顿路径的算法。我已经实现了一个看起来运行得相当好的算法,但是我不确定在某些情况下是否存在细微的错误或其他问题。因此,我需要一些解决方案已知的不同网络,以检查我的实现是否也正在解决它们。

由于维基百科暗示汉密尔顿路径只是无向图的合适术语,因此假设“汉密尔顿路径”是指在给定网络上定向或以其他方式访问每个节点一次且恰好一次的路径。

为简单起见,我们可以假设每个连接(或“边缘”)都具有正整数值(或“长度”)。我们还可以假设没有节点连接到自身,并且在任何两个节点之间每个方向上只能有一个边缘。

我碰巧对总长度最长的路径感兴趣,所以“最佳”意味着最长,尽管如果我想要最短的总长度(如传统的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。我相信贪婪的算法能够在这种情况下找到最佳解决方案,并且很可能很明显它是最好的解决方案。

1 个答案:

答案 0 :(得分:0)

当您阅读哈密尔顿路径上的Wiki条目时,您应该已经注意到找到哈密尔顿路径是NP难的(准确地说,您正在解决的是TSP - 但这并没有太大变化)。这一事实表明,贪婪算法无法为您提供最佳解决方案。

如果你的贪婪算法就像

那样
  

按下降值/长度排序边缘

     

将边缘添加到构造路径中,除非它

     

(a)创建一个循环

     

(b)在构造路径中创建一个deg = 3的节点

     

否则跳过它

这是最小的反例 - 我可以想到贪婪使其失败的地方:

  A B C D E F
A 0 5 4 0 0 0
B 5 0 5 0 4 0
C 4 5 0 1 0 0
D 0 0 1 0 5 4
E 0 4 0 5 0 5
F 0 0 0 4 5 0

贪婪算法找到路径A-B-C-D-E-F,总长度为21,而最佳路径为A-C-B-E-D-F,总长度为22(其中更多的长度相同)。

如果您的算法工作方式不同,它可能适用于此示例,但如果它是贪婪的话,仍会有反例。如果是这种情况,请发布您的代码并且您感兴趣。