找到并回答后如何停止回溯算法?
Posted
技术标签:
【中文标题】找到并回答后如何停止回溯算法?【英文标题】:How do I stop my backtracking algorithm once I find and answer? 【发布时间】:2020-10-13 04:22:22 【问题描述】:我编写了这段代码来解决课堂上给我的问题,任务是使用回溯解决"toads and frogs problem"。我的代码解决了这个问题,但一旦到达解决方案就不会停止(它会不断打印“状态”,显示其他不是问题解决方案的路径),有没有办法做到这一点?这是代码:
def solution_recursive(frogs):
#Prints the state of the problem (example: "L L L L _ R R R R" in the starting case
#when all the "left" frogs are on the left side and all the "right" frogs are on
#the right side)
show_frogs(frogs)
#If the solution is found, return the list of frogs that contains the right order
if frogs == ["R","R","R","R","E","L","L","L","L"]:
return(frogs)
#If the solution isn't the actual state, then start (or continue) recursion
else:
#S_prime contains possible solutions to the problem a.k.a. "moves"
S_prime = possible_movements(frogs)
#while S_prime contains solutions, do the following
while len(S_prime) > 0:
s = S_prime[0]
S_prime.pop(0)
#Start again with solution s
solution_recursive(s)
感谢进步!
【问题讨论】:
【参考方案1】:找到答案后如何停止回溯算法?
您可以为此目的使用 Python exception facilities。
您还可以采用 solution_recursive
返回一个布尔值告诉您停止回溯的约定。
这也是品味或意见的问题。
【讨论】:
没有更“花哨”的方法吗?我觉得例外将是一个丑陋的解决方案。 我们不同意。我在 ENPC 教 Python,昨天(2020 年 10 月 12 日)我教过,例外情况正好相反,非常适合这种情况。 谢谢!我将使用 sys.exit(0) 进行尝试,您认为这是否正确? 一般来说不是。一个设计良好的库不应该sys.exit
,除非在极少数情况下。它应该向调用者代码报告失败【参考方案2】:
我想稍微扩展一下您的递归代码。
您的一个问题是您的程序显示的路径不是解决方案。这是因为对solution_recursive
的每次调用都以
show_frogs(frogs)
不管frogs
是否是解决方案。
然后,您说即使在找到解决方案之后程序仍在继续。这有两个原因,第一个是你的while循环不关心是否找到了解决方案,它会遍历所有可能的动作:
while len(S_prime) > 0:
另一个原因是你每次调用这个函数时都在重新初始化S_prime
。我真的很惊讶它没有进入无限循环只是一遍又一遍地检查第一个动作。
由于这是课堂上的问题,我不会给你一个确切的解决方案,但这些问题需要解决,我相信你的教材可以指导你。
【讨论】:
show_frogs 位是因为作业要求我们显示问题的每个状态,以表明程序实际上正在使用回溯。我认为 while 部分可以更改,但我受到他们在课堂上向我们展示的伪代码的指导,其想法是每次递归都会创建一个您可以在给定位置执行的动作列表,因此它会在到达之前尝试所有可能的位置解决方案(即回溯)。也许我做错了,你的意见是什么? :) 哦,我明白了。我想我误解了possible_movements
所做的事情。然后避免无限循环,这样很好。我认为您应该考虑如何修改 while 循环,以便在找到解决方案时它不会继续循环。你为什么回frogs
?以上是关于找到并回答后如何停止回溯算法?的主要内容,如果未能解决你的问题,请参考以下文章