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也可能是一个解决办法。