【问题标题】:Palmer's Algorithm for Hamiltonian cycles哈密​​顿循环的 Palmer 算法
【发布时间】:2012-07-01 16:27:18
【问题描述】:

在“密集”图中,我正在尝试使用 Palmer's Algorithm 构建哈密顿循环。但是,我需要对这个算法进行更多解释,因为当我实现它时它对我不起作用。维基百科的解释似乎有一个不清楚的部分。

如果有人解释得更清楚或给我一些阅读链接,我将不胜感激。

这是算法语句:

Palmer (1997) 描述了以下简单算法,用于在满足 Ore 条件的图中构造哈密顿循环。 将顶点任意排列成一个循环,忽略图中的邻接关系。 当循环包含两个在图中不相邻的连续顶点vivi + 1 时,执行以下两个步骤:

  • 搜索索引j,使得vivi + 1vjvj + 1 四个顶点都是不同的,并且图包含从vi 到@ 的边987654330@ 和从vjvi + 1

  • 颠倒vi + 1vj(含)之间的循环部分。

更具体地说,我不明白他们所说的部分: “将顶点任意排列成一个循环” 在这种情况下,是否有权这样做:0,1,2,3,4,0

他们所说的“扭转循环的一部分”是什么意思?

【问题讨论】:

  • 在这里试一试会更好

标签: algorithm graph traveling-salesman hamiltonian-cycle


【解决方案1】:

确实,算法 is¹wikipedia's description 是错误的。帕尔默自己的描述是

  1. 第 0 步。将顶点排列成一个圆圈。

  2. 第 1 步。查看边界,例如逆时针方向,寻找连续的不相邻顶点,即间隙。如果没有间隙,则以边界上的跨越循环退出。否则,从间隙的顶点到可能相邻或不相邻的另一对连续顶点(可能的间隙 2)寻找一对交叉弦。

    如果找到,(即间隙 1 很好!),只需以明显的方式重新排列顶点的圆形顺序,使两个弦成为边界上的边,并将间隙切换到内部。每次我们成功地玩这种纵横交错的游戏时,顶点圆形排列的边界上的一两个间隙都会被两条边代替。否则,对下一个间隙重复第 1 步。

    继续直到跨越循环在边界上,或者直到每个间隙都坏了。

你需要一对交叉和弦,即你需要边

v_i <-> v_j
v_{i+1} <-> v_{j+1}

这样,通过将部分从v_{i+1} 反转为v_j(包括),您可以移动顶点v_j - 在图中与v_i 相邻 - 在您的循环中靠近v_i,并且顶点v_{i+1} - 在图中与v_{j+1} 相邻 - 在循环中移动到v_{j+1} 旁边。因此,我们在图中获得了两个新的循环邻居对,(v_i, v_j)(v_{i+1}, v_{j+1}),并可能破坏 一个 在图中相邻的循环邻居对,@ 987654333@。图中相邻的循环邻居对的数量每一步增加 1 或 2,因此算法终止。

由于维基百科的错误索引,将v_j 移动到v_i 旁边和v_{i+1}v_{j+1} 旁边不需要生成一对在图中相邻的新循环邻居,因此算法不需要终止。

那么让我们来看看你的例子

E = { (1,2), (1,3), (1,6), (3,2), (3,4), (5,2), (5,4), (6,4), (6,5) }

最初将其排列为1426351(没有相邻的邻居)。

图中第一对不相邻的循环邻居是(1,4) = (v_1,v_2)。扫描索引j &gt; 2 使得v_jv_1v_{j+1}v_2 相邻,第一个此类事件是j = 3。现在反转循环中的4...2部分(在这种情况下,4和2之间没有顶点),给出下一个循环

1234561  // index in cycle
1246351  // vertex

有两对相邻的邻居((1,2)(4,6))。第一个索引iv_i 不相邻v_{i+1} 是2。扫描第一个j &gt; 3 使得v_jv_2 = 2 相邻并且v_{j+1}v_3 = 4 相邻。这给了j = 5。现在v_3v_5(含)之间的部分,给出下一个循环

1234561  // index in cycle
1236451  // vertex

再一次,v_3 = 3 不与v_4 = 6 相邻,所以i = 3j = 5,反转收益率

1234561  // index in cycle
1234651  // vertex

现在唯一的坏对是(v_6,v_1) = (5,1)。最小的j &gt; 1 使得v_jv_6 = 5v_{j+1}v_1 = 1 相邻是j = 2。现在将部分从v_1 反转为v_2 产生

1234561  // index in cycle
2134652  // vertex

这是一个哈密顿循环。

¹我会马上修复它。

【讨论】:

  • 非常感谢 Daniel,我还注意到 Wikipedia 犯了这个错误,但我以与您不同的方式解决了它....可能相似但不完全相同。无论如何问题解决了......谢谢你的努力......我检查了你的解决方案并确保它有效......顺便说一句,你知道在这种情况下我应该怎么做(当维基百科犯这样的错误时) ...我的意思是读者会像我一样受苦。 (我已经受苦了 3 周)。
  • 如果您在 Wikipedia 文章中发现错误,请更正它(并说明旧文章错误的原因),它就是一个 wiki。不相关,而不是发布非答案,您应该评论我的答案,这也会通知我。 (但是,我看你的头像不一样,所以这不是你的问题,就系统而言,你不能在那个账号上评论,合并账号不是更好吗?)跨度>
【解决方案2】:

在这种情况下,是否有权这样做:0,1,2,3,4,0

是的。通过从更仔细选择的初始循环开始,您可能会获得更快的解决方案,但是只要图形满足 Ore 的条件,算法将从任何有效的初始循环开始成功。

他们所说的“扭转循环的一部分”是什么意思?

这意味着从 vi + 1 到 vj 的路径并将其反转,这样如果你开始:

vi, vi + 1, vi + 2, vj - 2, vj - 1, vj, vj + 1

你最终得到:

vi, vj, vj - 1, vj - 2, vi + 2, vi + 1, vj + 1

所以在您的示例中,如果我们选择 i = 0 和 j = 3,最终结果将是:

0, 3, 2, 1, 4, 0

这是Palmer's paper 的链接(请参阅维基百科中的参考部分)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-24
    • 1970-01-01
    • 2013-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-14
    相关资源
    最近更新 更多