蒙特卡洛树搜索算法(UCT): 一个程序猿进化的故事

前言:

本文是根据的文章Introduction to Monte Carlo Tree Search by Jeff Bradberry所写。
Jeff Bradberry还提供了一整套的例子,用python写的。
board game server
board game client
Tic Tac Toe board
AI implementation of Tic Tac Toe

阿袁工作的第一天 - 蒙特卡罗树搜索算法 - 游戏的通用接口board 和 player

阿袁看到阿静最近在学习蒙特卡罗树搜索算法。急忙凑上去问:“蒙特卡罗树搜索算法是干什么用的?”
"蒙特卡罗树搜索算法是一种方法(或者说框架),用于解决完美信息博弈。我现在学习一个蒙特卡罗树搜索算法的变种:UCT算法,用于提供一种通用的游戏对弈解决算法。"

注: perfect information games (完美信息)博弈,指的是没有任何信息被隐藏的游戏。

"通用的游戏对弈算法,是对任何游戏都有效,是吗?"
"简单的说,是这样的。重要的一点是,算法并不用了解游戏的领域知识。"
"领域知识?不是很好理解。难道连游戏规则也不知道,就可以赢吗?"
"游戏的领域知识。举个例子,国际象棋中每个棋子的子力,比如皇后的子力是10,车是5等等。这些就是领域知识。在通用的情况下,马的走法-这样的规则,也算是领域知识。"
"有点糊涂了!AI算法该如何下子呢?"
"用面向对象的逻辑来说,我们可以给游戏定义有一个通用接口(board),具体的游戏只能实现这个接口,不能提供其它的信息。"
"对于程序猿来说,这就容易理解多了。我们可以先看看这个接口(board),都应该定义什么样属性和方法。"
"首先,有一个num_players属性,返回游戏的玩家数。"
"嗯,让我想想,游戏开始的时候,需要一个方法start,启动一个游戏。"
"很好,这个方法需要返回一个state对象,用于记录游戏当前的状态。state对象的内容,外部是不可知的。使用board自己可以解释。"
"然后,需要显示棋盘的状态。这样,board就需要提供一个display方法,返回当前的状态或者是棋盘状态。"
"对。应该有个方法返回谁是该下子的玩家:current_player."
"当前玩家是一个AI玩家(也就是对弈算法的使用者),怎么知道如何下子呢?这里需要许多的领域知识吧?"
"一个技巧是让board根据历史的状态列表,返回当前允许的所有下法

网友评论