- 从今天起,我们开展一个新的专栏,神奇算法。。。。
- 好的,以后可能不读理论物理了,唉,看开了,要快乐。
- 祝我的朋友们都健康快乐啊
- 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()
蒙特卡罗树节点
- 方法
- 节点状态初始化函数
- 判断节点是否扩展完毕
- 生成所有可以扩展的节点
- 寻找最优子节点
- 模拟选择后运行结果
- 更新节点信息