Python 我是否缺少给定状态下操作的检查?

Python 我是否缺少给定状态下操作的检查?,python,machine-learning,artificial-intelligence,Python,Machine Learning,Artificial Intelligence,问题是: 三对传统但嫉妒的夫妻需要过河。每对夫妇由一对夫妇组成。他们找到了一艘最多只能容纳两人的小船。找出最简单的过河时间表,允许所有六个人过河,这样,除非她的丈夫在场,否则任何女人都不能和任何男人在一起。假设在下一次旅行之前船上的所有乘客以及至少一个人必须在船上进行每一次穿越 教授要求必须编辑掉代码 我已经研究这个问题6个小时了,我被难住了。我的教授很忙,帮不上忙。我要仔细看看你的代码。这确实是一个非常有趣和复杂的问题。过了一段时间,我意识到可能是因为你在穿越前检查了情况,而不是事后。A看到了

问题是: 三对传统但嫉妒的夫妻需要过河。每对夫妇由一对夫妇组成。他们找到了一艘最多只能容纳两人的小船。找出最简单的过河时间表,允许所有六个人过河,这样,除非她的丈夫在场,否则任何女人都不能和任何男人在一起。假设在下一次旅行之前船上的所有乘客以及至少一个人必须在船上进行每一次穿越

教授要求必须编辑掉代码


我已经研究这个问题6个小时了,我被难住了。我的教授很忙,帮不上忙。

我要仔细看看你的代码。这确实是一个非常有趣和复杂的问题。过了一段时间,我意识到可能是因为你在穿越前检查了情况,而不是事后。A看到了您提供的模板,我想我们可以尝试遵循1提出的逻辑-使action方法返回所有可能的交叉(尚未检查状态)2-给定每个操作,获取相应的新状态并检查该状态是否有效。3-使用value()方法检查优化是否取得进展

class Problem:
    def __init__(self, initial_state, goal):
        self.goal = goal
        self.record = [[0, initial_state, "LEFT", []]]
            # list of results [score][state][boat_side][listActions]

    def actions(self, state, boat_side):
        side = 0 if boat_side == 'LEFT' else 1
        boat_dir = 'RIGHT' if boat_side == 'LEFT' else 'LEFT'

        group = [i for i, v in enumerate(state) if v == side]
        onboard_2 = [[boat_dir, a, b] for a in group for b in group if 
            a < b and (     # not the same person and unique group 
            (a%2==0 and b - a == 1) or (        # wife and husband
            a%2==0 and b%2==0) or (             # two wife's
            a%2==1 and b%2==1)                  # two husbands
        )]
        onboard_1 = [[boat_dir, a] for a in group]
        return onboard_1 + onboard_2

    def result(self, state, action):
        new_boat_side = action[0]
        new_state = []
        for i, v in enumerate(state):
            if i in action[1:]:
                new_state.append(1 if v == 0 else 0)
            else:
                new_state.append(v)

        # check if invalid
        for p, side, in enumerate(new_state):
            if p%2 == 0: # is woman
                if side != new_state[p+1]: # not with husband
                    if any(men == side for men in new_state[1::2]):
                        new_state = False
                        break

        return new_state, new_boat_side

    def goal_test(self, state):
        return state == self.goal

    def value(self, state):
        # how many people already crossed
        return state.count(1)


# optimization process
initial_state = [0]*6
goal = [1]*6
task = Problem(initial_state, goal)

while True:
    batch_result = []
    for score, state, side, l_a in task.record:
        possible_actions = task.actions(state, side)
        for a in possible_actions:
            new_state, new_boat_side = task.result(state, a)
            if new_state: # is a valid state
                batch_result.append([
                    task.value(new_state),
                    new_state,
                    new_boat_side,
                    l_a + a,
                ])

    batch_result.sort(key= lambda x: x[0], reverse= True)
        # sort the results with the most people crossed
    task.record = batch_result[:5]
        # I am only sticking with the best 5 results but
        #   any number should be fine on this problem
    if task.goal_test(task.record[0][1]):
        break

#   for i in task.record[:5]: # uncomment these lines to see full progress
#       print(i)
#   x = input() # press any key to continue

print(task.record[0][3])
类问题:
定义初始(自我、初始状态、目标):
自我目标
self.record=[[0,初始_状态,“左”,[]]
#成绩表[得分][状态][船舷][列表行动]
def动作(自身、状态、船侧):
如果船侧=左,则侧=0,否则为1
船方向='右',如果船侧='左',否则为'左'
group=[i代表i,v在枚举(状态)中,如果v==side]
船上_2=[[boat_dir,a,b]针对a组,针对b组,如果
a

我希望这有帮助,如果还有什么不清楚的地方,请免费填写。

哇!我没想到会有人回答这个问题。我开始有同样的想法,我在穿越之前检查状态,这可能会导致一些问题。我做了一点修改,但截止日期已经过了,所以我只提交了我所拥有的。你超越了我,我真的很感激你。我已经接受了你的回答,我真的很感谢你的时间。只是好奇,你知道我把代码搞砸了吗?我知道我的代码和你的代码相比很差,但我很想知道我在哪里搞砸了,因为我试着测试同样的东西哈哈。我已经将你的答案标记为已接受的答案,所以你不必回答,但我很想知道我哪里搞砸了。再一次,非常感谢。嗨,杰米,感谢国王的回应。我做的第一件事是让代码运行,所以我尝试了你的想法,让action(state)方法只返回将导致有效状态的交叉。问题是,你必须检查1-十字架是有效的(在你的代码确定);2-做出十字后的状态有效(代码中缺少)。因此,当我开始进行所有可能的检查时,我意识到最好进行一次有效状态的总体检查。从第一个状态开始,action()方法返回“[('RIGHT',0),('RIGHT',1),('RIGHT',2),('RIGHT',3),('RIGHT',4),('RIGHT',5),('RIGHT',0,1),('RIGHT',0,2),('RIGHT',0,3),('RIGHT',0,4),('RIGHT',0,5),('RIGHT',1,0),('RIGHT',1,2),('RIGHT',1,3),[…长]('RIGHT',3,5),('RIGHT',4,1),('RIGHT',4,2),('RIGHT',4,3),('RIGHT',4,5),('RIGHT',5,1),('RIGHT',5,2),('RIGHT',5,3),('RIGHT',5,4)]“那么你的有效状态是什么如果您看到您的有效状态和我的“检查是否无效”状态,则它不会检查事后状态,因此无法正常工作