Algorithm 生成只有1个有效哈密顿圈的图
我正在寻找一些正确方向的建议/指导。 我的要求是生成一个图,而不是求解一个 我希望实现一个算法来生成一个只有1个哈密顿圈的图(NxN网格)。请注意,只有一个独特的解决方案至关重要。该图将是一个NxN节点网格,每个节点只有4个相邻节点,即顶部、右侧、底部和左侧。节点只能访问一次。除此之外,还有一些特殊的节点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
@ - 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具有唯一的解决方案。