【发布时间】:2021-07-20 17:55:02
【问题描述】:
我正在尝试一种蛮力 (generate and test) 方法来解决 Missionaries and Cannibals problem。
我有这个元组列表,它表示在给定状态上执行的操作:
# [(take one missionary, take no cannibals), (take no cannibals, take one missionary), etc]
actions = [(1, 0) (0, 1), (1, 1), (2, 0), (0, 2)]
我有这个起始状态:
# 3 cannibals and missionaries on the left side
initial_state = [3, 3, 0, 0, Left]
我有这个目标状态:
# 3 cannibals and missionaries on the right side
goal_state= [0, 0, 3, 3, Right]
我编写了以下函数来生成状态并测试每个生成状态的有效性:
def valid_state(a_state):
if (a_state[1] >= 0 and a_state[0] >= 0) and not (
do_cannibals_outnumber_missionaries(a_state[0], a_state[1])):
return True
else:
return False
def generate_states():
for i in moves:
a_state = [init_state[0] - i[0],
init_state[1] - i[1],
init_state[2] + i[0],
init_state[3] + i[1],
not init_state[4]] #cross to right side of river
if valid_state(a_state): #this weeds out invalid states
visited.append(a_state) #this list contains all the visited, valid states
当我以初始状态运行代码时,我得到:
[[3, 2, 0, 1, Right], [2, 2, 1, 1, Right], [3, 1, 0, 2, Right]]
我如何应用相同的逻辑从这些状态中生成更多状态(即,将传教士和食人族带到左侧并存储下一系列有效状态,直到我达到目标状态)?
我觉得这可以与递归一起使用...我不是在寻找高度优化的解决方案。
【问题讨论】:
标签: python recursion artificial-intelligence brute-force