这个python代码是使用BFS还是任何其他搜索算法



hi我正在编写这段python代码,想知道它使用哪种搜索算法来查找目标状态。我想知道以下代码是否使用BFS或任何其他搜索算法该代码解决了典型的农民、狼、卷心菜、山羊问题

initial = ['L', 'L', 'L', 'L']
goal = ['R', 'R', 'R', 'R']

stack = []
stack.append(initial)
def nextState(state):
if state == goal: return False
farmer = state[3]
for i, s in enumerate(state):
if s == farmer:
tryState = makeState(state, i)
if testState(tryState) and isUnique(tryState):
stack.append(tryState)
return True
return False       
def makeState(s, i):
t = []
for x in s: t.append(x)
t[3] = 'R' if t[3] == 'L' else 'L'
if t[3] == 'L':
if not testState(t):
t[i] = 'R' if t[i] == 'L' else 'L'
else:
t[i] = 'R' if t[i] == 'L' else 'L'
return t

def testState(s):
if s[0] == s[1] and s[3] != s[0]: return False
if s[1] == s[2] and s[3] != s[1]: return False
return True
def isUnique(s):     
if s in stack: return False
return True

while nextState(stack[-1]): pass
for i, x in enumerate(stack): 
print (i)
print (x)

简短回答

当您将下一个可能的状态添加到队列时,它将变为BFS,当您使用将它们添加到堆栈时,它变为DFS。

长答案

假设我们的起始节点是S,C是某个子节点,每个节点有3个子节点(只是为了简化解释,否则无关紧要(。

首先,让我们看看将子状态添加到队列时会发生什么。您将初始状态添加到队列中,队列中的当前节点为:

[S]

您从队列中获得一个节点(当前是您的起始节点(。您生成它的下一个状态并将其添加到队列中,队列中的节点现在是:

[C1, C2, C3]

您从数据结构中选择另一个节点,C1,因为它是一个队列,生成它的子节点,并将它们添加到队列中:

[C2, C3, C11, C12, C13]

让我们再重复几个步骤,您将从队列中获得C2和C3,并执行相同的操作:

[C11, C12, C13, C21, C22, C23, C31, C32, C33]

注意我们的模式。我们首先扩展到级别0(起始状态(的所有节点,然后扩展到级别1的所有节点(起始节点的第一个子节点(,现在我们将开始扩展到级别2的节点,以此类推。这就是为什么当你找到一个解决方案时,它必须是最接近你的起始状态的解决方案。


现在让我们看看如果使用堆栈数据结构会发生什么。第一步是一样的,在您生成开始节点的所有子节点并将它们放入堆栈后,堆栈现在包含:

[C1, C2, C3]

但现在的区别是,您将选择最后添加的节点进行扩展:

[C1, C2, C31, C32, C33]
[C1, C2, C31, C32, C331, C332, C333]
...

不要先在同一深度尝试所有可能的状态,而是选择一条路径,并尽可能深入。如果你在C3331找到了一个解决方案,你就不知道它是否是最优的,因为C21也可能是一个解决办法。

相关内容

最新更新