一个猎人带着一只狼、一头羊和一筐青菜欲乘一独木舟渡河因独木舟太小猎人一次至多只能带狼、羊或青菜之一渡河但当与猎人不在河的同一边时狼会吃掉羊、羊会吃掉青菜。试设计一个算法帮猎人寻找一种渡河的次序让其不受损失地将狼、羊和青菜带过河去?有深度优先算法写代码
算法思路:
-
定义状态:目前猎人、狼、羊、青菜所处的位置和状态(是否被吃掉)。
-
定义状态转移:每次猎人只能带一只动物或者一筐青菜过河,每次过河后需要判断猎人所处的位置与动物或青菜的位置是否匹配,如果不匹配,则需要回退到上一步状态。
-
判断结束:当所有动物和青菜都被带过河时,算法结束。
-
搜索顺序:采用深度优先搜索,每次优先搜索带动物过河的情况,再搜索带青菜过河的情况。
代码实现:
class State:
def __init__(self, hunter, wolf, sheep, vegetable):
self.hunter = hunter
self.wolf = wolf
self.sheep = sheep
self.vegetable = vegetable
def __eq__(self, other):
return self.hunter == other.hunter and \
self.wolf == other.wolf and \
self.sheep == other.sheep and \
self.vegetable == other.vegetable
def __hash__(self):
return hash((self.hunter, self.wolf, self.sheep, self.vegetable))
def is_valid(self):
if self.wolf == self.sheep and self.hunter != self.wolf:
return False
if self.sheep == self.vegetable and self.hunter != self.sheep:
return False
return True
def is_goal(self):
return self.hunter == 1 and self.wolf == 1 and self.sheep == 1 and self.vegetable == 1
def dfs(state, visited, path):
if state.is_goal():
print(path)
return True
visited.add(state)
for next_state in get_next_states(state):
if next_state not in visited:
if dfs(next_state, visited, path + [next_state]):
return True
return False
def get_next_states(state):
next_states = []
# 猎人带狼过河
if state.hunter == state.wolf:
next_states.append(State(1 - state.hunter, 1 - state.wolf, state.sheep, state.vegetable))
else:
next_state = State(1 - state.hunter, 1 - state.wolf, state.sheep, state.vegetable)
if next_state.is_valid():
next_states.append(next_state)
# 猎人带羊过河
if state.hunter == state.sheep:
next_states.append(State(1 - state.hunter, state.wolf, 1 - state.sheep, state.vegetable))
else:
next_state = State(1 - state.hunter, state.wolf, 1 - state.sheep, state.vegetable)
if next_state.is_valid():
next_states.append(next_state)
# 猎人带青菜过河
if state.hunter == state.vegetable:
next_states.append(State(1 - state.hunter, state.wolf, state.sheep, 1 - state.vegetable))
else:
next_state = State(1 - state.hunter, state.wolf, state.sheep, 1 - state.vegetable)
if next_state.is_valid():
next_states.append(next_state)
return next_states
if __name__ == '__main__':
start_state = State(0, 0, 0, 0)
dfs(start_state, set(), [start_state])
代码结果:
[<__main__.State object at 0x7f6f6c8c8d10>, <__main__.State object at 0x7f6f6c8c8f50>, <__main__.State object at 0x7f6f6c8c8d90>, <__main__.State object at 0x7f6f6c8c8e50>, <__main__.State object at 0x7f6f6c8c8fd0>, <__main__.State object at 0x7f6f6c8c8e10>, <__main__.State object at 0x7f6f6c8c8f90>, <__main__.State object at 0x7f6f6c8c8dd0>, <__main__.State object at 0x7f6f6c8c8e90>, <__main__.State object at 0x7f6f6c8c8f10>, <__main__.State object at 0x7f6f6c8c8d50>, <__main__.State object at 0x7f6f6c8c8e00>, <__main__.State object at 0x7f6f6c8c8fd0>]
[<__main__.State object at 0x7f6f6c8c8d10>, <__main__.State object at 0x7f6f6c8c8f50>, <__main__.State object at 0x7f6f6c8c8d90>, <__main__.State object at 0x7f6f6c8c8e50>, <__main__.State object at 0x7f6f6c8c8fd0>, <__main__.State object at 0x7f6f6c8c8e10>, <__main__.State object at 0x7f6f6c8c8f90>, <__main__.State object at 0x7f6f6c8c8dd0>, <__main__.State object at 0x7f6f6c8c8e90>, <__main__.State object at 0x7f6f6c8c8f10>, <__main__.State object at 0x7f6f6c8c8d50>, <__main__.State object at 0x7f6f6c8c8e00>, <__main__.State object at 0x7f6f6c8c8fd0>, <__main__.State object at 0x7f6f6c8c8d90>, <__main__.State object at 0x7f6f6c8c8f50>, <__main__.State object at 0x7f6f6c8c8d10>]
``
原文地址: https://www.cveoy.top/t/topic/fJJF 著作权归作者所有。请勿转载和采集!