马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
前情提要
本文是传知代码平台中的相干前沿知识与技能的分享~
接下来我们即将进入一个全新的空间,对技能有一个全新的视角~
本文所涉及全部资源均在传知代码平台可获取
以下的内容肯定会让你对AI 赋能期间有一个颠覆性的认识哦!!!
以下内容干货满满,跟上步调吧~
本章重点
一. 概述
各人肯定赞叹于AlphaGo zero在围棋范畴的巨大乐成,这种乐成泉源于强化学习的发展,在这里将以五子棋为例,向各人先容怎样从零开始手搓一个带有盘算本事的AI人工智能。
根本的算法与AlphaGo zero差不多,重要是自我博弈强化学习以及蒙特卡洛搜索树(MCTS)。
二. 实现过程
前期预备——棋盘的绘制
在这里,我们接纳python中的pygame作为我们的棋盘绘制工具,在此之前我们先须要棋盘、玄色棋子、白色棋子的素材。这部分素材放在了附件中,各人可以恣意下载。
我们通过一个Board棋盘类,来席卷全部跟棋盘有关的利用和属性
- class Board:
- def __init__(self, width = 15, height = 15, **kwargs):
- self.width = width # 棋盘宽度
- self.height = height # 棋盘高度
- self.winReg = 5 # 5个棋子一条线则获胜
- self.players = [1, 2]
- self.states = None # 棋盘状态
- self.current_player = None
- self.available = None
- self.last_move = None
复制代码 这些初始化的属性的作用都在代码中标注了出来。这个棋盘还须要一个初始化函数,用来清空棋盘上的齐备
- def init_board(self, start_player=0):
- # 初始化棋盘
- self.current_player = self.players[start_player] # 先手玩家
- self.available = list(range(self.width * self.height)) # 初始化可用的位置集合
- self.states = {
-
- } # 初始化棋盘状态
- self.last_move = -1 # 初始化最后一次的移动位置
复制代码 棋局的状态
怎样生存棋局的状态呢?
我们参考的是AlphaGo Zero中的设置,即利用4个15x15的二值特性平面来形貌当前的局面,前两个平面分别表现当前player的棋子位置和对手player的棋子位置,有棋子的位置是1,没棋子的位置是0;第三个平面表现对手player近来一步的落子位置,也就是整个平面只有一个位置是1,别的全部是0;第四个平面表现的是当前player是不是先手player,假如是先手player则整个平面全部为1,否则全部为0
- def update_board_state(self):
- board_layers = np.zeros((4, self.width, self.height))
- if self.states:
- actions, players = np.array(list(zip(*self.states.items())))
- current_player_moves = actions[players == self.current_player]
- opponent_moves = actions[players != self.current_player]
- board_layers[0][current_player_moves // self.width, current_player_moves % self.width] = 1
- board_layers[1][opponent_moves // self.width, opponent_moves % self.width] = 1
- board_layers[2][self.last_move // self.width, self.last_move % self.width] = 1
- if len(self.states) % 2 == 0:
- board_layers[3][:, :] = 1.0
- return board_layers[:, ::-1, :]
复制代码 这里就涉及到我们怎样设定棋子在棋盘中的位置了,它有一个二维坐标,但是为了方便我们偶尔候会把它设置为一个一维的坐标并随时举行转化
- def move_to_location(self, move):
-
- h = move // self.width
- w = move % self.width
- return [h, w]
- def location_to_move(self, location):
- h = location[0]
- w = location[1]
- move = h*self
复制代码 |