帕尔默的哈密顿循环算法

时间:2012-06-30 11:18:34

标签: algorithm graph traveling-salesman hamiltonian-cycle

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

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

这是算法声明:

  Palmer(1997)描述了以下用于在符合Ore条件的图中构建哈密顿循环的简单算法。   将顶点任意排列成一个循环,忽略图中的邻接。   虽然周期包含两个在图表中不相邻的连续顶点vivi + 1,但请执行以下两个步骤:

     
      
  • 搜索索引j,使四个顶点vivi + 1vjvj + 1都是截然不同的该图表包含从vivj + 1以及从vjvi + 1

  • 的边   
  • vi + 1vj(包括)之间反转周期的一部分。

  •   

更具体地说,我没有得到他们所说的部分: “将顶点任意排列成一个循环” 在这种情况下,这是否正确:0,1,2,3,4,0

他们的意思是:“扭转周期的一部分”?

2 个答案:

答案 0 :(得分:1)

  

在这种情况下,这是否正确: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的链接(请参阅维基百科中的参考部分)。

答案 1 :(得分:1)

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

  
      
  1. 步骤0.将顶点排列成圆圈。

  2.   
  3. 步骤1.围绕边界,例如逆时针方向,查看连续的非相邻顶点,即间隙。如果没有间隙,则退出边界上的生成周期。否则,从间隙的顶点到另一对可能相邻或不相邻的连续顶点寻找一对交叉和弦(可能的间隙2)。

         

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

         

    继续,直到跨越周期在边界上,或直到每个间隙都不好。

  4.   

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

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

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

如果维基百科的索引编号错误,则(v_j, v_{j+1})旁边的v_jv_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 > 2v_jv_1v_{j+1}相邻,第一次出现v_2。现在反转循环中的j = 3部分(在这种情况下,4和2之间没有顶点),给出下一个循环

4...2

有两对相邻的邻居(1234561 // index in cycle 1246351 // vertex (1,2))。 (4,6)i不相邻的第一个索引v_i为2.扫描第一个v_{i+1}j > 3v_j相邻,与v_2 = 2相邻的v_{j+1}。这给了v_3 = 4。现在是j = 5v_3(包括)之间的部分,给出下一个周期

v_5

再一次,1234561 // index in cycle 1236451 // vertex v_3 = 3不相邻,因此v_4 = 6i = 3会产生逆转

j = 5

现在唯一的坏对是1234561 // index in cycle 1234651 // vertex 。最小(v_6,v_1) = (5,1)使j > 1v_j相邻,v_6 = 5v_{j+1}相邻v_1 = 1。现在将部分从j = 2反转为v_1,产生

v_2

这是哈密顿循环。

¹我马上解决它。