问题描述
我已经实现了Dynamic Connect的规范化版本,但是我无法解决我面临的一个问题,该问题显然是当minimax搜索树时会改变当前状态。极小极大返回正确的移动,但未正确应用。
def humanPolicy(game,state,player=-1):
instructions= input('Input action:')
action = game.instructions_to_actions(state,instructions,player)
return actin
def minimax(game,st,depth,player):
def recurse(st,depth):
if game.isEnd(state,player) or depth == 0:
return (game.utility(st,player),0)
choices = [(recurse(game.action_succ(st,action,depth - 1)[0],action) for action in game.actions(st,player)]
if player ==1:
return (max(choices))
elif player == -1:
return min(choices)
value,action = recurse(st,depth)
print('minimax says action={},value = {}'.format(action,value))
return action
# stt = {}
w_list = [(5,1),(1,3),4),(7,5),(3,7)]
b_list = [(4,2),6),(5,7),(6,7)]
policies = {1: humanPolicy,-1: minimax}
game = DynamicConnect(w_list,b_list)
state = game.InitialState()
st = state
player = 1
depth = 3
while True:
board = [['.' for i in range(7)] for j in range(7)]
if player == 1:
print('Player: White: O')
else:
print('Player: Black: X')
print(state)
for (x,y) in state[0]:
board[y-1][x-1] = 'O'
for (x,y) in state[1]:
board[y-1][x-1] = 'X'
print(*(' '.join(row) for row in board),sep='\n')
print('='*10,state)
# policy = policies[player]
if player == 1:
action = humanPolicy(game,player)
else:
action = minimax(game,player)
print(action)
state = game.action_succ(st,player)
st = state
player = -player
if game.isEnd(state,player):
print('Game over')
print('utility = {}'.format(game.utility(state,player)))
print(state)
这是动作后继函数,它会返回新状态,但是当它从minimax接收到动作时,它将无法正常工作。
def action_succ(self,player):
initial_pos = action[0]
new_pos = action[1]
if player == -1:
if initial_pos in state[1]:
state[1][state[1].index(initial_pos)] = new_pos
else:
if initial_pos in state[0]:
state[0][state[0].index(initial_pos)] = new_pos
return (state)
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)