Algorithm 帕默';哈密顿圈的s算法

Algorithm 帕默';哈密顿圈的s算法,algorithm,graph,traveling-salesman,hamiltonian-cycle,Algorithm,Graph,Traveling Salesman,Hamiltonian Cycle,在一个“稠密”图中,我正试图用它来构造一个哈密顿圈。然而,我需要对这个算法进行更多的解释,因为当我实现它时,它不适用于我。维基百科的解释似乎有一个不明确的部分 如果有人解释得更清楚或给我一些链接阅读,我将不胜感激 下面是算法声明: Palmer(1997)描述了以下在满足Ore条件的图中构造哈密顿圈的简单算法。 将顶点任意排列成一个循环,忽略图形中的邻接。 当循环包含两个在图中不相邻的连续顶点vi和vi+1时,执行以下两个步骤: 搜索索引j,使四个顶点vi、vi+1、vj和vj+1都是不同的,

在一个“稠密”图中,我正试图用它来构造一个哈密顿圈。然而,我需要对这个算法进行更多的解释,因为当我实现它时,它不适用于我。维基百科的解释似乎有一个不明确的部分

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

下面是算法声明:

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,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
这里有一个链接(请参阅维基百科的参考部分)。

事实上,算法的错误之处在于。帕默自己的描述是

  • 第0步。将顶点排列成一个圆

  • 第一步。在边界周围(如逆时针方向)查看连续的非相邻顶点,即间隙。如果没有间隙,则在边界上退出跨越循环。否则,查找从间隙顶点到可能相邻或不相邻的其他一对连续顶点的一对交叉弦(可能为间隙2)

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

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

  • 您需要一对交叉和弦,即您需要边

    v_i <-> v_j
    v_{i+1} <-> v_{j+1}
    
    最初将其排列为
    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
    
    1234561  // index in cycle
    1236451  // vertex
    
    有两对相邻的邻居(
    (1,2)
    (4,6)
    )。第一个索引
    i
    v_i
    不相邻
    v_{i+1}
    为2。扫描第一个
    j>3
    ,使
    v_j
    v_2=2
    相邻,且
    v_{j+1}
    v_3=4
    相邻。这就给出了
    j=5
    。现在是
    v_3
    v_5
    之间的部分,给出下一个循环

    1234561  // index in cycle
    1246351  // vertex
    
    1234561  // index in cycle
    1236451  // vertex
    
    再一次,
    v_3=3
    v_4=6
    不相邻,因此
    i=3
    j=5
    ,相反

    1234561  // index in cycle
    1234651  // vertex
    
    现在唯一的错误对是
    (vu 6,vu 1)=(5,1)
    。最小的
    j>1
    ,使得
    v_j
    v_6=5
    相邻,并且
    v_{j+1}
    to
    v_1=1
    j=2
    。现在将零件从
    v_1
    反转为
    v_2

    1234561  // index in cycle
    2134652  // vertex
    
    这是一个哈密顿循环


    ➣我会马上解决。

    如果你把你的尝试放在这里会更好。非常感谢你,丹尼尔,我也注意到维基百科犯了这个错误,但我用了一种与你不同的方式解决了它……可能相似,但不完全相同。不管怎么说,问题解决了…谢谢你们的努力…我检查了你们的解决方案并确保它有效…顺便问一下,你们知道在这种情况下我应该怎么做(当维基百科犯下这样的错误)…我的意思是读者会像我一样痛苦。如果你在维基百科的一篇文章中发现了一个错误,请纠正它(并给出旧文章错误的原因),这是一个维基。不相关的,你应该对我的答案发表评论,而不是发布非答案,这也会通知我。(但是,我看到你的gravatar是不同的,所以就系统而言,这不是你的问题,你不能从该帐户对此发表评论。合并你的帐户不是更好吗?)