我已经玩过哈密尔顿路径一段时间了,并且已经找到了一些很酷的用途。一种是一种谜题,其目标是连接所有节点以形成哈密尔顿路径。
因此,作为一名新手程序员,我创建了一个非常基本的蛮力图生成器,它创建了具有哈密顿路径的图形。但是当我尝试将图形大小增加到10x10时会出现问题。毋庸置疑,蛮力无法在那里发挥作用。
我理解汉密尔顿路径是一个NP完全问题,但是有一种优化图形生成过程的方法。任何可以在合理的时间内创建15x15网格的技巧。
非常感谢你。
答案 0 :(得分:1)
您正在寻找所谓的“ Backbite算法”-从任何哈密顿路径开始,一个简单的路径就可以做到(在网格中来回曲折,或者呈螺旋状)。
然后循环随机次数:
选择任一端点
至少有两个且最多四个相邻的顶点;随机选择一个不是您开始的终点的哈密尔顿邻居的
如果第二点不是另一个端点
a。连接您选择的两个点-这将产生一个图形,看起来像一个带有尾巴的循环
b。找到导致循环的边(不是您刚刚添加的边,而是它的邻居之一),然后将其删除(这是“回位”步骤)
如果在第3步中第二个点是另一个端点,则将两者合并(您现在将具有哈密顿环),并删除其他任意边
> li>在每个步骤中,新图形仍然是哈密顿路径。