Minmax更改了当前状态,我想不出如何避免这个问题

问题描述

我已经实现了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 (将#修改为@)