我在JGraphT中有一个4875|7854|74|1
,想知道是否有
哈密尔顿路径
汉密尔顿循环
如果存在,我也想得到它。
我只找到TwoApproxMetricTSP
和HamiltonianCycle
。
但两者都需要完整的图表。
一个明显的解决方案是在我的图表中添加边缘并使其成为加权图表,其中添加边缘的权重非常高,以至于它们不会在路径中使用。
但这会增加许多边缘,我想避免这种情况。
有没有更好的方法来获得汉密尔顿路径/循环而不自行实现算法?
答案 0 :(得分:1)
决策问题“图表是否包含哈密顿循环(HC)”是NP-Complete。 JGraphT不包括使用不完整图形的算法,因此唯一的解决方案是通过添加具有足够大权重的边来使图形完整。然后,当且仅当您找到没有添加任何昂贵边缘的游览时,才存在HC。 请注意,在下一个版本(1.1.1)中,有一个新的精确算法(参见master branch,Held Karp动态编程方法)。该算法不能超过32个顶点。如果你有一个大图,我的建议是使用TwoApproxMetricTSP。如果您确实需要求解(合理大小)图形,则必须采用线性规划。另请参阅TSP解算器Concorde。对于大多数TSP应用程序,我将实现专用的,高效的数据结构,例如,将边/邻居存储在整数数组中。