【问题标题】:Irregular Grid and Hamiltonian paths不规则网格和哈密顿路径
【发布时间】:2023-04-10 19:54:01
【问题描述】:

我有一个问题。有没有一种有效的方法来获取网格图中两个节点之间的哈密顿路径,而将一些预定义的节点排除在外?

例如。 (4*3格)

1 0 0 0
0 0 0 0
0 0 2 3

在这个网格中找到一条哈密顿路径 b/w 顶点 1 和 2,但不覆盖 3?似乎二分图是一种方法,但是根据您的说法,这一定是最有效的方法。问题本身是 NP 完全的。

【问题讨论】:

  • 你的图形表示是什么?这些行是邻接列表吗?
  • 哦,实际上,我认为我明白了。您有布置在网格上的节点,并且您在该网格上标记了三个感兴趣的顶点。对吗?
  • 好吧,我必须找到编号为 1(起点)的顶点和编号为 2(终点)的顶点之间的哈密顿路径。但我不应该在我的路径中包含第 3 个顶点。
  • 这张图上的连通性是什么?只是左右上下?还是对角线?所有的边权重都相等吗?
  • 根据this paper 所述的问题确实是 np-complete(参见 Sect.2, Cor.2 [p.681])。

标签: c++ c algorithm graph-algorithm


【解决方案1】:

删除不需要包含的节点并运行蛮力算法以找到哈密顿路径。这将需要 O((n-h)!+n),即 NP,其中 h 是删除的节点数,但这是你能做的最好的。为了找到哈密顿路径,还有一种动态方法,但这也是指数(O(2^n*n^2))

【讨论】:

    【解决方案2】:

    没有必要将这些预定义节点排除在外:只需考虑它们已访问,您仍然可以将图表作为矩形网格图。如果效率很重要,我会推荐网格的位集或位向量表示。

    当网格如此小(4x3)时,蛮力方法是最快的。除非您有更大的图表(6x7+),否则动态编程实际上会使其变慢。您也可以使用启发式方法来修剪您的搜索树,但同样,图表必须更大才能发挥作用。

    【讨论】:

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