这是我的问题:我有一个点数组,这些点有三个属性:“x”和“y”坐标,以及序列号“n”。 “x”和“y”是为所有点定义的,“n”不是。 您可以访问和编写呼叫点[i] - > x,points [i] - > y,points [i] - > n。即:
points[i]->n = var
var = points[i]->n
所以标题可能会让人感到惊讶,但我正在寻找一个可能的哈密尔顿路径问题解决方案的实现:我需要设置每个点的“n”个数,这样序列就是最短路径(不是循环,边缘必须是不相交的),每个点只进行一次。我寻找了一个解决方案,我找到了The Bellman Ford Algorithm,但我认为它不起作用,因为问题没有说明它必须通过所有的点是否正确?
如果是,有人有另一种算法和实施吗? 如果Bellman Ford算法有效,我该如何实现呢?
非常感谢,
于连
编辑:问题是我必须重新创建一个代表公交车站的地理点列表,我必须找出一个真实的序列。性能并不重要,因为目标只是填充数据库。
修改:这是一张图片:My Hamiltonian Path Problem http://www.stoeffler.cc/hpp.png
答案 0 :(得分:4)
这称为Euclidean Travelling Salesman(二维),也像TSP一样是NP-Complete。
其他答案是不准确,因为他们正在做相反的事情:将问题减少到汉密尔顿路径,而它应该反过来,以显示NP完整性。很抱歉这样说,但这似乎是这个网站上一个非常常见的问题。
我们可以说这个从根本上与以下意义上的普通TSP不同:
如果P!= NP,
TSP没有PTAS(实际上也是公制TSP,距离满足三角不等式)。
Euclidean TSP有一个PTAS。查看Arora的论文,其中给出了1 + 1 / c近似算法,运行时为O(n(logn)^ O(c)):Polynomial time approximation schemes for Euclidean TSP and other geometric problems。请注意,Euclidean TSP是度量TSP的特殊情况,但它以这种方式不同。
还有其他算法可以保证2近似(使用最小生成树)和3/2近似,并且可能更简单。 Arora的论文提到了那些,你应该能够使用Arora论文中的参考资料进行追踪。
答案 1 :(得分:2)
Bellman-Ford算法通常用于解决单源最短路径问题。
最短的汉密尔顿路径问题属于一类称为NP-hard的问题。这意味着您必须尝试所有排列以保证找到最短路径。这种方法仅适用于正常人体寿命内的小问题。
您可以使用Bellman-Ford算法为每个节点生成一组单源最短路径,以帮助您解决问题,但您可能会发现Floyd-Warshall算法更受欢迎。 Floyd-Warshall将为您提供从图中每个节点到每个其他节点的最短路径。这是一个O(N ^ 3)算法,具有O(N ^ 2)个内存要求。
一旦你有节点之间的最短路径,那么你可以尝试所有的排列来找到最短的汉密尔顿路径,或者你可以使用启发式算法从一个基本的可行解开始并迭代到最短的近似路径。
我在模拟退火和禁忌搜索方面取得了一些成功。还有一种基于蚂蚁踪迹的相当有趣的方法,这种方法是在我最后一次解决这类问题时发布的。
祝你好运。答案 2 :(得分:1)
在汉弥尔顿路径问题是的 NP完全下,所以很明显使用Bellman-Ford算法,这是多项式不能找到一个解决方案。
您可以使用以下步骤解决哈密尔顿路径问题:
第一变换汉弥尔顿路径问题入的哈密顿环问题即可。 为此,请将顶点添加到初始图形并将其连接到所有现有顶点。
然后变换哈密顿环问题入的旅行推销员问题下, 通过创建一个完整的图形并将权重= 0分配给 上一个图表和权重= 1到其余边缘。
最后,通过使用已知的算法(例如,动态编程)解决了TSP。
修改强>: 我刚刚意识到你寻求最短路径。有了上述内容,您只能回答图表是否具有哈密尔顿路径(并且可能找到一个)。