【问题标题】:How to apply a brute force approach to solve Missionaries and Cannibals problem?如何应用蛮力方法解决传教士和食人族问题?
【发布时间】: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


    【解决方案1】:

    找到所有解决方案的递归程序的一般形式如下:

    all_paths = []
    def move_boat(state, history=None):
        if history is None:
            history = []
        # if len(history) > 50: return
        if is_final_state(state):  # are we finished?
            all_paths.append(history + [state])
        else:
            for new_state in generate_next_states(state, actions):  # generate all possible next states
                if not is_legal_state(new_state):
                    continue
                move_boat(new_state, history + [state])
    

    由于通过生成来回移动同一个人的动作可能会进入无限循环,因此您可能应该进行一些安全检查,例如注释掉的 if 语句。

    【讨论】:

    • 感谢您的指导。我认为 generate_next_states(state, actions) 返回有效下一个状态的 LIST 是否正确?
    • 是的,或者基于actions的所有可能的下一个状态。
    猜你喜欢
    • 2021-04-25
    • 1970-01-01
    • 1970-01-01
    • 2020-02-16
    • 2019-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-04
    相关资源
    最近更新 更多