gpt4 book ai didi

python - "Hamiltonian"路径使用 Python

转载 作者:太空宇宙 更新时间:2023-11-04 00:24:21 24 4
gpt4 key购买 nike

我正在尝试使用 Python 实现对遍历所有图形顶点的任意路径(不一定是循环)的递归搜索。这是我的代码:

def hamilton(G, size, pt, path=[]):
if pt not in set(path):
path.append(pt)
if len(path)==size:
return path
for pt_next in G[pt]:
res_path = [i for i in path]
hamilton (G, size, pt_next, res_path)

这里,pt是起点,path是之前遍历的所有顶点的列表,不包括pt,默认为空。问题是,无论何时找到这样的路径,返回语句都会引用过程的某些内部调用,因此程序不会终止或返回路径。

例如,取 G = {1:[2,3,4], 2:[1,3,4], 3:[1,2,4], 4:[1,2, 3]}(即完整的 4 图)并运行 hamilton(G,4,1,[])。它返回 None,但如果您打印路径而不是将其作为值返回,您会发现它实际上找到了从 1 开始的所有六个路径。

如果我告诉程序打印路径和 return 语句,它最终会打印所有这些路径,因此运行时间比需要的长得多。

如何修复代码,以便在找到第一个合适的路径后终止执行?

最佳答案

基本错误是递归调用的结果需要返回,如果它没有导致死胡同的话。

此外,如果点pt 没有邻居,G[pt] 将引发IndexError。使用 dict.get 可以很容易地解决这个问题。

def hamilton(G, size, pt, path=[]):
print('hamilton called with pt={}, path={}'.format(pt, path))
if pt not in set(path):
path.append(pt)
if len(path)==size:
return path
for pt_next in G.get(pt, []):
res_path = [i for i in path]
candidate = hamilton(G, size, pt_next, res_path)
if candidate is not None: # skip loop or dead end
return candidate
print('path {} is a dead end'.format(path))
else:
print('pt {} already in path {}'.format(pt, path))
# loop or dead end, None is implicitly returned

例子

>>> G = {1:[2,3,4], 2:[1,3,4], 3:[1,2,4], 4:[1,2,3]}
>>> hamilton(G, 4, 1)
hamilton called with pt=1, path=[]
hamilton called with pt=2, path=[1]
hamilton called with pt=1, path=[1, 2]
pt 1 already in path [1, 2]
hamilton called with pt=3, path=[1, 2]
hamilton called with pt=1, path=[1, 2, 3]
pt 1 already in path [1, 2, 3]
hamilton called with pt=2, path=[1, 2, 3]
pt 2 already in path [1, 2, 3]
hamilton called with pt=4, path=[1, 2, 3]
[1, 2, 3, 4]
>>> G = {1:[2], 2:[3,4], 4:[3]}
>>> hamilton(G, 4, 1)
hamilton called with pt=1, path=[]
hamilton called with pt=2, path=[1]
hamilton called with pt=3, path=[1, 2]
path [1, 2, 3] is a dead end
hamilton called with pt=4, path=[1, 2]
hamilton called with pt=3, path=[1, 2, 4]
[1, 2, 4, 3]
>>> G = {1:[2], 2:[3,4], 4:[3]}
>>> hamilton(G, 4, 2)
hamilton called with pt=2, path=[]
hamilton called with pt=3, path=[2]
path [2, 3] is a dead end
hamilton called with pt=4, path=[2]
hamilton called with pt=3, path=[2, 4]
path [2, 4, 3] is a dead end
path [2, 4] is a dead end
path [2] is a dead end
None

请注意,由于“可变默认参数”问题,多次使用该函数可能会导致错误结果。但这不是这个答案的范围。

关于python - "Hamiltonian"路径使用 Python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47982604/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com