michi.py 程序解读
在复现alphago的过程中,我们在rollout policy这里遇到一些麻烦。为了弄清楚alphago的rollout policy 的feature 输入,准备学习下github上的michi.py这个easy go bot,帮助自己理解rollout policy及mcts(蒙特卡洛搜索)。
准备
michi.py
该文件应该是采用montecarlo方法结合hard coding的一些pattern(比如3×3 pattern,12 point diamond pattern)实现的一个简单围棋AI
主要函数解释
class Position(namedtuple(‘Position’, ‘board cap n ko last last2 komi’)):
记录了棋局状态,其中类的popery属性board中存储了当前棋盘棋子分布情况,采用字符串存储,相当于RocAlphago程序中的gamestate类。
类中有def move(self, c)/def pass_move(self)/def moves(self, i0)等方法。
这里采用了collections下的namedtuple模块,namedtuple(‘Position’, ‘board cap n ko last last2 komi’)在当前文件内新建了名字为Position的类,类中有board cap n ko last last2 komi几个popery成员。
|
|
def load_spat_patterndict(f)/def load_large_patterns(f):
加载棋局pattern文件,让bot 更加stronger
其中load_spat_patterndict(f)用于加载patterns.spat文件,文件内容
|
|
读取时会自动过滤掉前面带#号的,将表示pattern字符串部分转换为hash值作为字典spat_patterndict的index,对应pattern的编号。
load_large_patterns(f)则加载文件patterns.prob,里面存储pattern对应的概率信息:
|
|
读取时构建字典large_patterns,字典的index为s后面的数字,对应前面的概率。
至此spat_patterndict字典为pattern字符串编码得到的hash值到pattern编号的映射,large_patterns字典为pattern编号到概率值的映射。def cfg_distances(board, c):
计算棋盘上各位置和指定位置的manhattan距离,边界填充为-1,形状和board一致。
def pat3_expand(pat):
对3×3的pattern进行变换,得到所有可能情况,然后构造得到pat3set
|
|
def neighborhood_gridcular(board, c):
这个函数是一个generator,根据board和指定位置c,从内层到外层(这个层的概念参见12 point diamond,只不过前面两层合并了)根据八个rotation操作,遍历层内点,生成层内点操作之后的字符串。
用于和加载的patterns.spat文件中的pattern比较。
def large_pattern_probability(board, c):
计算board中c局部区域的局势,以c为中心,不断增大12 point diamond形状的层,将neighborhood_gridcular产生的该层字符串与的patterns.spat文件中的pattern字符串做匹配(事实上这里直接检查匹配对应的hash值),同时返回匹配得到的该pattern的概率(概率通过字典large_patterns查询),匹配过程则是当连续两层没有匹配到pattern则停止。
|
|
def gen_playout_moves(pos, heuristic_set, probs={‘capture’: 1, ‘pat3’: 1}, expensive_ok=False):
根据匹配特征,填充集合already_suggested
同时模拟随机走子
def mcplayout(pos, amaf_map, disp=False):
to be continued
源码
|
|