将极大极小算法应用于以数组形式存储的决策树,Python
我正在尝试创建一个Tic-Tac-Toe游戏,允许用户对程序进行游戏。该程序使用Minimax算法修剪决策树并输出最优移动。下面我已经将代码发布到我正在开发游戏Ai类的地方。函数“create_tree”返回一个决策树,其中包含从根节点开始的所有可能移动以及状态发生的深度。我曾尝试通过一个模块来传递此信息,该模块应用极小极大修剪方法来找到下一个应采取的最佳动作,但它不起作用,因为当我尝试评估游戏状态时,IDLE抛出了错误: 回溯(最近一次调用上次):文件 “C:\Users\Faisal\Documents\Python\Comp4 project\class\u test3.py”,第行 87,在 打印(node.minimax())文件“C:\Users\Faisal\Documents\Python\Comp4 project\class\u test3.py”,第行 56,极小极大 if self.check_if_won(节点[each])==1:TypeError:列表索引必须是整数,而不是列表 我的代码如下:将极大极小算法应用于以数组形式存储的决策树,Python,python,algorithm,artificial-intelligence,tic-tac-toe,minimax,Python,Algorithm,Artificial Intelligence,Tic Tac Toe,Minimax,我正在尝试创建一个Tic-Tac-Toe游戏,允许用户对程序进行游戏。该程序使用Minimax算法修剪决策树并输出最优移动。下面我已经将代码发布到我正在开发游戏Ai类的地方。函数“create_tree”返回一个决策树,其中包含从根节点开始的所有可能移动以及状态发生的深度。我曾尝试通过一个模块来传递此信息,该模块应用极小极大修剪方法来找到下一个应采取的最佳动作,但它不起作用,因为当我尝试评估游戏状态时,IDLE抛出了错误: 回溯(最近一次调用上次):文件 “C:\Users\Faisal\Doc
Board = ['X', 'X', 3, 'O', 5, 'X', 7, 'O', 9]
whose_move = 1
depth = 0
class Node():
def __init__(self, Board, whose_move):
self.Board = Board
self.whose_move = whose_move
self.win_comb = ((0,1,2), (3,4,5), (6,7,8), (6,3,0), (7,4,1), (8,5,2), (6,4,2), (8,4,0))
self.piece = 'X'
self.depth = depth
def create_tree(self,piece=None,Board=None):
if Board is None:
Board = self.Board
depth = self.depth
if piece is None:
piece = self.piece
child_nodes = []
for index, square in enumerate(Board):
if square == index + 1: # if square not taken
new_board = Board[:] # make a shallow copy
new_board[index] = piece
child_nodes.append(new_board)
if self.check_if_won(new_board) == -1: # removed self in arguments
if piece == 'X':
child_nodes.append(self.create_tree('O',new_board))
else:
child_nodes.append(self.create_tree('X',new_board))
return [child_nodes]
def check_if_won(self,Board=None):
for each in self.win_comb:
if (Board[each[0]] == Board[each[1]] and Board[each[1]]== Board[each[2]]):
return 1
for index,square in enumerate(Board):
if square == index + 1:
return -1
return 0
def who_won(Board=None):
for each in self.win_comb:
if(Board[each[0]]) == 'X':
return 1
else:
return 0
def minimax(self,node=None,player=None):
best= None
if node == None:
node = self.create_tree()
if player == None:
player = 'X'
for each in node:
if self.check_if_won(node[each])== 1:
if self.who_won(node[each]) == 1:
return 1
elif self.who_won(node[each]) == 0:
return -1
elif self.check_if_won(node[each]) == 0:
return 0
for move in node:
if player == 'X':
val = self.minimax(node,'O')
else:
val = self.minimax(node,'X')
if player == 'X':
if val > best:
best = val
else:
if val<best:
best = val
return best
node = Node(Board, whose_move)
n = node.create_tree()
print(n)
print(node.minimax())
因此,产生错误的原因是可以理解的,但我不知道如何以系统顺序提取树不同深度的每个游戏状态。“不工作”请解释更多@Arman当程序运行时,我收到错误消息val=self.minimax(node,'O')和val=self.minimax(node,'X'),请解释完整的trackback@Arman我已经编辑了这篇文章来澄清我的问题,并添加了一个完整的错误回溯。我认为你应该尝试
self。检查你是否赢了(每个)=
,因为你迭代了节点
列表“不工作”请解释更多!@Arman当程序运行时,我收到错误消息val=self.minimax(node,'O')和val=self.minimax(node,'X')。请完整解释trackback@Arman我编辑了这篇文章来澄清我的问题,并添加了一个完整的错误回溯。我认为你应该试试self。如果你赢了,检查一下(每个)==
因为您迭代了节点
列表
[[['X', 'X', 'X', 'O', 5, 'X', 7, 'O', 9], ['X', 'X', 3, 'O', 'X', 'X', 7, 'O', 9], [[['X', 'X', 'O', 'O', 'X', 'X', 7, 'O', 9], [[['X', 'X', 'O', 'O', 'X', 'X', 'X', 'O', 9], [[['X', 'X', 'O', 'O', 'X', 'X', 'X', 'O', 'O']]], ['X', 'X', 'O', 'O', 'X', 'X', 7, 'O', 'X']]], ['X', 'X', 3, 'O', 'X', 'X', 'O', 'O', 9], [[['X', 'X', 'X', 'O', 'X', 'X', 'O', 'O', 9], ['X', 'X', 3, 'O', 'X', 'X', 'O', 'O', 'X']]], ['X', 'X', 3, 'O', 'X', 'X', 7, 'O', 'O'], [[['X', 'X', 'X', 'O', 'X', 'X', 7, 'O', 'O'], ['X', 'X', 3, 'O', 'X', 'X', 'X', 'O', 'O'], [[['X', 'X', 'O', 'O', 'X', 'X', 'X', 'O', 'O']]]]]]], ['X', 'X', 3, 'O', 5, 'X', 'X', 'O', 9], [[['X', 'X', 'O', 'O', 5, 'X', 'X', 'O', 9], [[['X', 'X', 'O', 'O', 'X', 'X', 'X', 'O', 9], [[['X', 'X', 'O', 'O', 'X', 'X', 'X', 'O', 'O']]], ['X', 'X', 'O', 'O', 5, 'X', 'X', 'O', 'X'], [[['X', 'X', 'O', 'O', 'O', 'X', 'X', 'O', 'X']]]]], ['X', 'X', 3, 'O', 'O', 'X', 'X', 'O', 9], [[['X', 'X', 'X', 'O', 'O', 'X', 'X', 'O', 9], ['X', 'X', 3, 'O', 'O', 'X', 'X', 'O', 'X'], [[['X', 'X', 'O', 'O', 'O', 'X', 'X', 'O', 'X']]]]]...