Algorithm 生成只有1个有效哈密顿圈的图

Algorithm 生成只有1个有效哈密顿圈的图,algorithm,graph,graph-algorithm,path-finding,hamiltonian-cycle,Algorithm,Graph,Graph Algorithm,Path Finding,Hamiltonian Cycle,我正在寻找一些正确方向的建议/指导。 我的要求是生成一个图,而不是求解一个 我希望实现一个算法来生成一个只有1个哈密顿圈的图(NxN网格)。请注意,只有一个独特的解决方案至关重要。该图将是一个NxN节点网格,每个节点只有4个相邻节点,即顶部、右侧、底部和左侧。节点只能访问一次。除此之外,还有一些特殊的节点 死节点,即它们没有边缘连接 固定入口和出口节点,即入口和出口节点已定义,其他节点无法与给定节点连接。它可以是一个。相邻节点b。直节点 一些例子: @ - means that nodes ca

我正在寻找一些正确方向的建议/指导。

我的要求是生成一个图,而不是求解一个

我希望实现一个算法来生成一个只有1个哈密顿圈的图(NxN网格)。请注意,只有一个独特的解决方案至关重要。该图将是一个NxN节点网格,每个节点只有4个相邻节点,即顶部、右侧、底部和左侧。节点只能访问一次。除此之外,还有一些特殊的节点

  • 死节点,即它们没有边缘连接
  • 固定入口和出口节点,即入口和出口节点已定义,其他节点无法与给定节点连接。它可以是一个。相邻节点b。直节点
  • 一些例子:

    @ - means that nodes can be connected with adjacent nodes (top,right,bottom,left)
    $ - indicated dead end (no connections with adjacent nodes)
    
    Graph 1 =>
    @-@-@
    @-$-@
    @-@-@
    
    Solution 1 =>
    1-2-3
    8-$-4
    7-6-5
    
    here the solution of the graph is 1->2->3->4->5->6->7->8->1. Notice how the $ node was not included in the final solution.
    

    我的方法: 我取一个n*n网格,首先在图上放置随机的死节点。在此之后,我放置随机特殊节点。然后,我运行一个dfs搜索,遍历整个网格,以查看是否存在一个有效的循环,该循环满足特殊节点条件,并且只访问每个节点一次(起始节点除外),并在起始节点结束,使其成为一个完整的循环

    我的问题是: 我在这里要问的是如何确保图只有一个有效循环。我可以做的一件事是,通过在每个循环之后添加更多的死节点和特殊节点,在这个级别上递归迭代,直到有效哈密顿循环的数量减少到1。这就是我计划实施的


    理想情况下,您将如何处理此问题?首先,我想指出,我尚未找到完整的解决方案

    我要做的是在网格中生成一个循环,并存储这个“解”,然后在所有缺失的平方上添加一个死端,这使得生成的循环成为哈密顿量。然后,我将按照你的方法,迭代添加“强制边”,并检查是否存在第二个(读作:“不止一个”)哈密顿循环

    这种检查可以表述为以下问题:“如果已知一个哈密顿圈,如何检查给定的平面图是否包含多个哈密顿圈?”

    我使用“平面”的原因很容易解释。起始栅格是平面的,删除节点或强制边不会使其成为非平面的。这是因为强制边a-B可以在a-X-B中变换,其中X是一个新节点,因此需要通过导致强制边被访问的任何哈密顿循环访问

    我尝试将一个哈密顿循环转换为另一个哈密顿循环的方法如下所示:


    如果取两个平面哈密顿循环,并取它们不匹配的所有边,这些边将形成一个循环(可能多次访问节点)。这个圈的性质是边在一个哈密顿圈和另一个哈密顿圈之间交替。我找不到扭转这一过程的方法。

    首先,我想说的是,我还没有找到一个完整的解决方案

    我要做的是在网格中生成一个循环,并存储这个“解”,然后在所有缺失的平方上添加一个死端,这使得生成的循环成为哈密顿量。然后,我将按照你的方法,迭代添加“强制边”,并检查是否存在第二个(读作:“不止一个”)哈密顿循环

    这种检查可以表述为以下问题:“如果已知一个哈密顿圈,如何检查给定的平面图是否包含多个哈密顿圈?”

    我使用“平面”的原因很容易解释。起始栅格是平面的,删除节点或强制边不会使其成为非平面的。这是因为强制边a-B可以在a-X-B中变换,其中X是一个新节点,因此需要通过导致强制边被访问的任何哈密顿循环访问

    我尝试将一个哈密顿循环转换为另一个哈密顿循环的方法如下所示:


    如果取两个平面哈密顿循环,并取它们不匹配的所有边,这些边将形成一个循环(可能多次访问节点)。这个圈的性质是边在一个哈密顿圈和另一个哈密顿圈之间交替。我找不到一种方法来逆转这个过程。

    为什么不将外部节点连接成一个圆圈,并将所有内部节点标记为“死节点”

    例如,借用上面的符号

    3x3图

    @@@
    @$@
    @@@
    
    4x4图

    @@@@
    @$$@
    @$$@
    @@@@
    
    5x5图

    @@@@@
    @$$$@
    @$$$@
    @$$$@
    @@@@@
    

    始终只有一个解决方案,并且很容易生成任意大小的图形。

    为什么不将外部节点连接成一个圆,并将所有内部节点标记为“死节点”

    例如,借用上面的符号

    3x3图

    @@@
    @$@
    @@@
    
    4x4图

    @@@@
    @$$@
    @$$@
    @@@@
    
    5x5图

    @@@@@
    @$$$@
    @$$$@
    @$$$@
    @@@@@
    

    始终只有一个解决方案,并且很容易生成任意大小的图形。

    您可以添加一个网格示例吗?“我不是从你的描述中了解到的。@CaptainTrunky添加了一个小示例,以显示包含常规节点和死节点的基本图形。以后可以添加特殊节点(它们所做的只是限制与相邻节点的连接)。因此,一个特殊节点可以强制它只能从顶部和左侧节点连接,而不考虑左侧和底部。这将有助于确保图形具有唯一的解决方案。您可以添加一个网格示例吗?“我不是从你的描述中了解到的。@CaptainTrunky添加了一个小示例,以显示包含常规节点和死节点的基本图形。以后可以添加特殊节点(它们所做的只是限制与相邻节点的连接)。因此,一个特殊节点可以强制它只能从顶部和左侧节点连接,而不考虑左侧和底部。这将有助于确保graph具有唯一的解决方案。