在“密集”图中,我试图使用Palmer's Algorithm构建哈密顿循环。但是,我需要对此算法进行更多解释,因为在我实现它时它不能与我一起工作。似乎维基百科的解释中有一个不明确的部分。
如果有人更清楚地解释它或给我一些阅读链接,我将感激不尽。
这是算法声明:
Palmer(1997)描述了以下用于在符合Ore条件的图中构建哈密顿循环的简单算法。 将顶点任意排列成一个循环,忽略图中的邻接。 虽然周期包含两个在图表中不相邻的连续顶点vi
和vi + 1
,但请执行以下两个步骤:
- 的边
搜索索引
j
,使四个顶点vi
,vi + 1
,vj
和vj + 1
都是截然不同的该图表包含从vi
到vj + 1
以及从vj
到vi + 1
在
vi + 1
和vj
(包括)之间反转周期的一部分。
更具体地说,我没有得到他们所说的部分: “将顶点任意排列成一个循环” 在这种情况下,这是否正确:0,1,2,3,4,0
他们的意思是:“扭转周期的一部分”?
答案 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是¹是错误的。帕尔默自己的描述是
步骤0.将顶点排列成圆圈。
- 醇>
步骤1.围绕边界,例如逆时针方向,查看连续的非相邻顶点,即间隙。如果没有间隙,则退出边界上的生成周期。否则,从间隙的顶点到另一对可能相邻或不相邻的连续顶点寻找一对交叉和弦(可能的间隙2)。
如果找到,(即间隙1很好!),只需以明显的方式重新排列顶点的圆形顺序,使两个和弦成为边界上的边缘,并将间隙切换到内部。每次我们成功地玩这个纵横交错的游戏时,顶点圆形排列的边界上的一个或两个间隙被两个边缘替换。否则,请在下一个间隙重复步骤1。
继续,直到跨越周期在边界上,或直到每个间隙都不好。
你需要一对交叉和弦,即你需要边
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_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 > 2
与v_j
和v_1
与v_{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 > 3
与v_j
相邻,与v_2 = 2
相邻的v_{j+1}
。这给了v_3 = 4
。现在是j = 5
和v_3
(包括)之间的部分,给出下一个周期
v_5
再一次,1234561 // index in cycle
1236451 // vertex
与v_3 = 3
不相邻,因此v_4 = 6
,i = 3
会产生逆转
j = 5
现在唯一的坏对是1234561 // index in cycle
1234651 // vertex
。最小(v_6,v_1) = (5,1)
使j > 1
与v_j
相邻,v_6 = 5
与v_{j+1}
相邻v_1 = 1
。现在将部分从j = 2
反转为v_1
,产生
v_2
这是哈密顿循环。
¹我马上解决它。