算法专栏:蒙特卡罗树搜索算法

  • Post author:
  • Post category:其他


  • 从今天起,我们开展一个新的专栏,神奇算法。。。。
  • 好的,以后可能不读理论物理了,唉,看开了,要快乐。
  • 祝我的朋友们都健康快乐啊

  • Monte Carlo Tree Search(MCTS)最早被应用于智能围棋游戏中,现在已被广泛应用于博弈论和人工智能领域。
  • MCTS 算法的基本思想是通过模拟多次游戏来搜索最优解,通过对每个可能的行动进行模拟,来评估每个行动的价值,并最终选择价值最高的行动。
  • MCTS 算法分为四个步骤:选择、扩展、模拟和回溯。

    • 首先,从根节点开始,选择一个未被探索过的子节点。(UCB1)(PUCT)
    • 齐次,将选中的子节点进行扩展,生成所有可能的子节点。
    • 然后,对每个子节点进行模拟,直到达到终止状态。
    • 最后,将模拟结果回溯到根节点,更新每个节点的价值和访问次数。
  • 现在我们一一个经典课程作业:智能五子棋为例,开始快乐的学习

五子棋结构

import numpy as np

class GameBoard:
    #注释:
    #player:1/-1 标记正在下棋的一方,显然,下的棋子的符号等于下棋一方的编号

    def __init__(self,player=1,width=15,length=15):
        self.board = np.zeros((length,width))
        self.player = player
        self.winner = None
        self.width = width
        self.length = length
        
    def get_legal_actions(self):
        legal_actions = []
        for i in range(self.length):
            for j in range(self.width):
                if self.board[i][j] == 0:
                    legal_actions.append((i,j))
        return legal_actions

    def do_action(self,action):
        i,j = action
        self.board[i][j] = self.player
        self.player = -self.player

    def get_winner(self):
        for i in range(self.length):
            for j in range(self.width):
                if self.board[i][j] == 0:
                    continue
                if j + 4 < self.width and self.board[i][j] == self.board[i][j+1] == self.board[i][j+2] == self.board[i][j+3] == self.board[i][j+4]:
                    self.winner = self.board[i][j]
                    return self.winner
                if i + 4 < self.length and self.board[i][j] == self.board[i+1][j] == self.board[i+2][j] == self.board[i+3][j] == self.board[i+4][j]:
                    self.winner = self.board[i][j]
                    return self.winner
                if i + 4 < self.length and j + 4 < self.width and self.board[i][j] == self.board[i+1][j+1] == self.board[i+2][j+2] == self.board[i+3][j+3] == self.board[i+4][j+4]:
                    self.winner = self.board[i][j]
                    return self.winner
                if i + 4 < self.length and j - 4 >= 0 and self.board[i][j] == self.board[i+1][j-1] == self.board[i+2][j-2] == self.board[i+3][j-3] == self.board[i+4][j-4]:
                    self.winner = self.board[i][j]
                    return self.winner
        return self.winner

    def print_board(self):
        for i in range(self.width):
            print(" ",i,end=" ")
        print("\n")
        for i in range(self.length):
            print(i,end=" ")
            for j in self.board[i]:
                print(j,end=" ")
            print("\n")
#### 一个棋盘案例
##g = GameBoard()
##
##g.do_action([1,1])
##g.do_action([1,10])
##g.do_action([2,2])
##g.do_action([1,9])
##g.do_action([3,3])
##g.do_action([2,8])
##g.do_action([4,4])
##g.do_action([7,7])
##g.do_action([5,5])
##g.get_winner()
##g.print_board()

蒙特卡罗树节点

  • 方法

    • 节点状态初始化函数
    • 判断节点是否扩展完毕
    • 生成所有可以扩展的节点
    • 寻找最优子节点
    • 模拟选择后运行结果
    • 更新节点信息



版权声明:本文为Chandler_river原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。