我正在尝试在 Python 中实现 BFS,我了解该算法的工作原理,但我没有太多的编程经验。我花了几个小时思考代表一切的最佳方式以及如何尽可能高效。我一直无法弄清楚如何获取从我的起始节点到目标节点的路径。
我花了很长时间在谷歌上搜索并查看其他人的算法实现,但我的应用程序略有不同,这让我感到困惑。当人们实施 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 循环会将这些新节点中的每一个附加到队列中,并访问队列,它将在生成的节点之一具有与我的目标状态匹配的状态下重复。
现在我已经找到了目标节点,我有一个访问节点的列表,但是如果我从目标节点向后跟踪路径,我不是减慢了算法吗?找到目标后,我会查看其父级,在访问列表中找到其父级,然后查看父级的父级,等等……直到我有一个 path = [node object, node object, ... ] 从初始节点到目标节点。
这给我带来了另一个问题,当我创建一个节点对象时,它只持续一次 while 循环的迭代。我打算如何将对象存储在数组中,它们每个都需要一个唯一的名称,并且(对我而言)没有明显的方法可以做到这一点。这是我之前提到的我不确定的问题。所以看起来我正在创建节点,但只将 node.state 存储在队列中,这是没有意义的,因为我需要节点对象来访问 node.parent ...
为什么我觉得这很困难,是我遗漏了一些明显的东西还是把它弄得太复杂了?
谢谢阅读。