【问题标题】:Implementation of any Hamiltonian Path Problem algorithm任何哈密顿路径问题算法的实现
【发布时间】:2010-05-25 19:01:40
【问题描述】:

这是我的问题:我有一个点数组,这些点具有三个属性:“x”和“y”坐标,以及一个序列号“n”。 “x”和“y”是为所有点定义的,“n”不是。 您可以调用 points[i]->x、points[i]->y、points[i]->n 来访问和编写它们。即:

points[i]->n = var
var = points[i]->n

所以标题可能毁了这个惊喜,但我正在寻找解决哈密顿路径问题的可能实现:我需要设置每个点的“n”数,以便序列是 最短路径(不是循环,边缘必须是不相交的),它通过每个点恰好一次。我寻找了一个解决方案,我找到了The Bellman Ford Algorithm,但我认为它不起作用,因为问题没有指定它必须通过所有点,对吗?

如果是,是否有人有另一种算法和实现? 如果贝尔曼福特算法有效,我将如何实现它?

非常感谢,

朱利安

编辑:问题是我必须重新创建代表巴士站的地理点列表,并且我必须找出一个现实的顺序。性能根本不重要,因为目标只是填充数据库。

编辑:这是一张图片:My Hamiltonian Path Problem http://www.stoeffler.cc/hpp.png

【问题讨论】:

    标签: algorithm geometry graph


    【解决方案1】:

    这被称为Euclidean Travelling Salesman(二维),也是像 TSP 一样的 NP-Complete。

    其他答案是不准确,因为它们正在做相反的事情:将您的问题减少到哈密顿路径,而应该反过来,以显示 NP 完全性。很抱歉这么说,但这似乎是这个网站上很常见的问题。

    我们可以说这个从根本上在以下意义上不同于普通的 TSP:

    如果 P != NP,

    • 对于 TSP 没有 PTAS(实际上对于公制 TSP 也是如此,其中距离满足三角不等式)。

    • 有一个适用于欧几里得 TSP 的 PTAS。查看 Arora 的这篇论文,其中给出了 1+1/c 近似算法,运行时间为 O(n (logn)^O(c)):Polynomial time approximation schemes for Euclidean TSP and other geometric problems。请注意,欧几里得 TSP 是度量 TSP 的一个特殊情况,但它在这方面有所不同。

    还有其他算法可以保证 2 近似(使用最小生成树)和 3/2 近似,并且可能更简单。 Arora 的论文中提到了这些,您应该能够使用 Arora 论文中的参考资料进行追踪。

    【讨论】:

    • @Julien:你需要的实现取决于你愿意接受什么样的近似值,因为试图获得最优值很快就会失控(随着点数的增加)。
    • 我认为即使检查图中是否存在哈密顿循环也是 NP 完备的。
    • @gmatt:是的,哈密顿路径/循环的决策问题是 NP 完全的。事实上,这是最早被证明是 NP-Complete 的几个图问题之一。不过,OP 提出的问题有所不同,它是加权哈密顿路径问题的搜索版本的一个非常具体的情况,并且也被证明是 NP 完全的。
    【解决方案2】:

    Bellman-Ford 算法常用于解决单源最短路径问题。

    最短哈密顿路径问题属于一类称为 NP-hard 的问题。这意味着您必须尝试所有排列以保证找到最短路径。这种方法只适用于正常人类寿命范围内的小问题。

    您可以使用 Bellman-Ford 算法为每个节点生成一组单源最短路径来帮助您解决问题,但您可能会发现 Floyd-Warshall 算法更可取。 Floyd-Warshall 将为您提供从图中每个节点到其他每个节点的最短路径。这是一个 O(N^3) 算法,需要 O(N^2) 内存。

    一旦您获得了节点之间的最短路径,那么您可以尝试所有排列以找到最短的哈密顿路径,或者您可以使用启发式算法从基本可行解决方案开始并迭代到最短的近似值路径。

    我在模拟退火和禁忌搜索方面取得了一些成功。还有一种基于蚂蚁踪迹的相当有趣的方法,它是在我上次必须解决此类问题时发布的。

    祝你好运。

    【讨论】:

    • 谢谢帮忙,很有意思,问题是我不懂图论的词汇,所以不知道怎么实现上找到的伪代码:en.wikipedia.org/wiki/Floyd–Warshall_algorithm 你能帮忙吗?我正在编辑我的问题以使其更准确,将在几分钟内完成。谢谢
    • 同一篇文章中的“实施”部分有一些很好的链接。您没有提到您使用的是哪种语言,但从“->”我猜是 C 或 C++。 Wikipedia 文章链接到 Joshua Robinson 的实现,并指出 Boost Graph Library 包含 C++ 实现。从头开始制作一个商业质量的 C 实现需要几天的时间,而且我以前做过一次 - 所以如果需要一些时间,请不要感到难过。
    【解决方案3】:

    哈密顿路径问题是NP-complete,所以很明显你无法使用多项式的Bellman-Ford算法找到解决方案。

    您可以使用以下步骤来解决哈密顿路径问题:

    • 首先将哈密顿路径问题转换为哈密顿循环问题。 要实现这一点,请将一个顶点添加到您的初始图形并将其连接到所有现有顶点。

    • 然后将哈密顿循环问题转化为旅行商问题, 通过创建一个完整的图形并将权重 = 0 分配给存在于图形中的边 上一个图和权重 = 1 到其余边。

    • 最后,使用已知算法(例如动态规划)求解 TSP。

    编辑: 我刚刚意识到你在寻找最短路径。有了以上内容,您只能在图确实具有哈密顿路径(并且可能找到)时才能回答。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-08-14
      • 1970-01-01
      • 1970-01-01
      • 2011-07-17
      • 1970-01-01
      • 1970-01-01
      • 2014-12-20
      相关资源
      最近更新 更多