
围棋博弈系列
wangqs1988
这个作者很懒,什么都没留下…
展开
-
围棋博弈程序的实现与思考(6)——博弈树的构建
为了实现UCT算法,需要在内存中构建一棵博弈树,博弈树的每个节点是博弈过程中的一个局面。 一个显而易见的方法是——构建树形的数据结构,每个节点保存3类信息:1)该节点所代表的局面。2)局面信息(当前收益值与被尝试次数)。3)子节点的索引。 出于以下两个考虑,我并没有用这个方法。 1)尽可能地减少内存占用。 2)细究之,围棋博弈原创 2011-11-20 21:26:01 · 689 阅读 · 0 评论 -
围棋博弈程序的实现与思考(3)——UCT算法
我们已经知道UCB算法能够更快地找到靠谱的着手点,续上一篇的问,能不能再优化? 首先要知道的是,为什么UCB算法比盲目的蒙特卡罗局面评估收敛得更快?我的理解,是因为在算法执行的过程中,UCB算法能不断根据之前的结果调整策略,选择优先评估哪一个可下点。其实这是一种在线的机器学习策略。对于上一篇提到过的多臂匪徒问题,可以用UCB算法很好地解决。对于围棋博弈问题而言,UCB算法相比于朴原创 2011-08-28 21:50:23 · 1128 阅读 · 0 评论 -
围棋博弈程序的实现与思考(5)——提子算法
提子算法的好坏对整个程序的性能影响是很大的。尽管在实际对局中,提子行为并不经常发生,但每次落子时计算机都得判断是否需要提子。根据围棋规则,可得提子算法的步骤,以黑棋落子为例:1)依次判断与该落子点相邻的白子所在棋串(棋盘上实线相连的棋子集)的气,如为0,则提走棋串。2)如果1)中不存在提子行为,则计算该落子点所在棋串的气是否为0,若不为0,则落子合法,若为0则不合法。这只是个粗略的步骤原创 2011-11-05 14:46:49 · 872 阅读 · 0 评论 -
围棋博弈程序的实现与思考(2)——探索与利用
上一篇介绍了蒙特卡罗局面评估算法,怎样用这个算法实现围棋博弈程序呢?最容易想到的方法是,对于一个给定的局面,用蒙特卡罗局面评估算法来评估每一个可下点后的局面,由此选取最佳着手点。这是可行的,但有没有可以优化的地方呢? 假设你是CPU,你知道围棋规则,但不知道更高层次的围棋知识,只会模拟随机对局,面对茫茫棋盘,你将如何选择?你会逐个点模拟对局1万次,最后通过比较评估值大小来选择最优原创 2011-08-21 17:24:18 · 784 阅读 · 0 评论 -
围棋博弈程序的实现与思考(4)——棋盘的数据结构
UCT算法算是介绍完了,以后主要讲实践。 由于在面向对象的编程语言中,本人只会C++和Objective-C(以后也许会写一些iOS开发相关的博文),出于性能的考虑,选择C++是必然的。记得当初开题答辩时,一老师问道,既然考虑性能,为什么不用C,而用C++?对于这种明知故问无厘头的问题,我只能回答:机器码性能更好。后来才知道陈志行老师的”手谈“是用汇编写的……原创 2011-09-04 22:50:16 · 805 阅读 · 3 评论 -
围棋博弈程序的实现与思考(1)——局面评估
毕业也有两个月了,写这篇文章算是纪念我的毕设——围棋博弈程序的设计与实现。选了这个找抽的课题作为毕设,一度不知该如何实现,还好万能的微博让我得知了现代计算机围棋的核心算法——UCT算法。而蒙特卡罗局面评估算法是UCT算法的基础。本文作为本系列第一篇文章,先介绍蒙特卡罗局面评估算法。 计算机围棋博弈问题的一大难点在于难以设计简单有效的局面评估算法。传统的围棋程序主要采用影响函数等专原创 2011-08-14 00:46:32 · 995 阅读 · 2 评论 -
围棋博弈程序的实现与思考(7)——运行结果
这个是打谱,不是人机对弈……数子……9路盘的人机对弈,程序是黑棋,让4子棋,走得实在不咋地……但它确实是在走围棋……原创 2011-12-17 00:27:34 · 587 阅读 · 0 评论 -
围棋博弈程序的实现与思考(8)——Zobrist哈希
本来并不想写着篇,因为英文维基上的zobrist hashing词条已经够详实了。后来发现自己的论文上有图文并茂的一节介绍zobrist哈希,想是为凑字数与图片写的,贴出来倒也方便: Zobrist 哈希是一种专门针对棋类游戏而提出来的编码方式,以其发明者 Albert L.Zobrist 的名字命名。Zobrist 哈希通过一种特殊的置换表,也就是对棋盘上每一位置的各个原创 2011-12-22 23:21:25 · 925 阅读 · 0 评论