我试图在Python中实现BFS,我理解算法是如何工作的,但我没有太多的编程经验。我花了好几个小时的时间思考最好的方式来表现一切,以及如何尽可能高效。我一直无法弄清楚如何获得从我的开始节点到目标节点的路径。在Python中的广度优先搜索实现
我花了年龄周围的Googling和寻找其他人民实现算法的,但我的应用程序略有不同,这让我困惑。当人们实施BFS时,他们假设他们有一张给他们的图表(正如维基百科关于BFS的文章)。在我的问题中,我有一个初始状态和一个我想要达到的目标状态,但没有图或树,所以我正在生成节点。
例如:
def BFS(initial, goal):
q = [initial]
visited = []
while q:
n = q.pop()
states = generate_states(n)
for state in states:
if state == goal:
pass #placeholder
q.append(state)
visited.append(state)
它不能正常充实,因为我有东西麻烦,我不知道它具体是要么...如果初始和目标是节点,和我在我的代码写在别处结构类型类如:
class node:
state = None
parent = None
我觉得这是代表一个节点一个合适的方式。因此,当我从队列中弹出一个节点对象时,它具有关于它的起源位置的信息,它将由generate_states函数初始化。然后,for循环会将每个新节点追加到队列中,并且访问队列,并且它会在其中一个生成的节点下重复出现一个与我的目标状态匹配的状态。
现在,我已经发现目标节点,则我曾参观过的节点列表,但如果我跟踪路径向后从目标节点的路径,不是我放慢算法?一旦找到目标,我会查看它的父项,在访问列表中找到它的父项,然后查看父项的父项等...直到我有一个路径= [节点对象,节点对象,... ]从初始节点到目标节点。
这使我想起了另一个问题,当我创建一个节点对象只持续了while循环的一个迭代。我如何将对象存储在数组中,它们每个都需要一个唯一的名称,而且对我来说没有明显的方法来执行此操作。这是我之前提到的我不确定的问题。所以它看起来像我创建的节点,但只有在队列中存储node.state,这是毫无意义的,因为我需要节点对象访问node.parent ...
为什么我觉得这很难,我错过了一些明显的东西,或者使这个过于复杂?
感谢您的阅读。
有一个初始状态和一个目标状态以及有限数量的操作符。正如你所说,我没有给出一个图,我必须构建它,这是通过应用一套操作完成的,我使用函数generate_states(n),其中n是一个节点。最后,我将遍历每个状态并最终得到一棵树,该树终止于目标节点。我试图了解如何做到这一点,然后从目标节点向后追踪以在树中查找路径。对不起,如果这更令人困惑。 – user1291204 2012-04-14 15:16:51