我最近试图想出汉密尔顿路径的总数(基本上从起始顶点开始,一次访问每个节点并到达终点顶点)。蛮力dfs在中等大小的7x8网格上进行长距离漫步。我提出了一些这些狡猾的策略。这些修剪技术的目标是不应该进一步扩展不能成为哈密尔顿路径的部分路径。
DFS算法: 从起始顶点开始,访问其邻居节点并递归。保持访问的节点数和一旦到达结束顶点,检查totla访问的节点是否与网格中的总节点相同。对于每个顶点,你可以在4个方向上进行指数复杂化,这将是O(4 ^ n)。因此,重点应该是尽快拒绝路径,而不是等到达到终点顶点。
修剪技巧:
1)对于给定的部分路径,检查是否连接了剩余的图形。如果不是,那么这条局部路径最终不会成为哈密尔顿路径。
2)对于给定的部分路径,每个尚未访问的节点必须具有至少2度,以便可以使用一个邻居节点进入该节点并使用其他其他邻居退出。
我想知道这些修剪技术能节省多少时间。我也错过了一些非常重要的修剪技术,因为我的加速并不重要。
提前致谢!!!
答案 0 :(得分:0)
有一个O(n ^ 2 * 2 ^ n)解决方案适用于一般图表。该结构与此处描述的O(2 ^ n * n ^ 2)算法相同,
http://www.algorithmist.com/index.php/Traveling_Salesperson_Problem
除了记录最小距离外,您正在记录计数。
你可以做的任何修剪都会有所帮助。