Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将极大极小算法应用于以数组形式存储的决策树,Python_Python_Algorithm_Artificial Intelligence_Tic Tac Toe_Minimax - Fatal编程技术网

将极大极小算法应用于以数组形式存储的决策树,Python

将极大极小算法应用于以数组形式存储的决策树,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

我正在尝试创建一个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:列表索引必须是整数,而不是列表

我的代码如下:

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']]]]]...