nowcan的一些资料

nowcan 研究资料之广泛偶特佩服。尤其其中关于mpc。偶至今还没看明白。现在把一些简单易懂的资料贴上来做个备份。

http://www.cs.ualberta.ca/~Emburo/log.html http://www.cam.org/~bigjeff/Hannibal.html http://www.aaai.org/AITopics/html/othello.html

由于找不到更多的训练棋局,我的黑白棋模板训练暂停。现简单介绍一下我这个黑白棋程序。     1、数据结构、搜索算法     棋盘的数据结构采用了100项的一维数组,速度没有位棋盘快,但在当前框架下不使用汇编已经很难再优化了,速度大概是WZebra的1/4。     搜索算法用了经典的PVS+置换表,由于是严格条件剪枝,搜索深度不大,中局时5秒时间一般只能搜索7~8层,终局5秒则一般是18层左右。中局搜索节点排序的优先级依次是 置换表中的最优节点、1层搜索的估值。终局搜索在深度大于15时也采用中局搜索的策略,而最终15步则采用了置换表中最优节点、棋盘预排序、稳定角排序和行动力排序。     2、开局库     采用简单的线性结构,对大量的棋局统计,根据局面下所有走法的获胜率排序,选取胜率最高的走法。这种开局库很原始,效果很差,后来我的程序已经放弃使用了。     3、估值     估值是最重要的,采用了基于模板的估值方法,使用了13种模板,比WZebra多两种(一种是长度为8的边,另一种是角上的总数为10的三角形,现在觉得长度为8的边没多大的作用,是“边+X格”这种模板的子集,但程序已经定型,模板计算也已经完成,不想去改了)。训练模板时使用了edax提供的棋局库和开局库、世界黑白棋比赛1980~2004年的棋局库、Logistello的开局库2份、还有GGS建立以来所有的双方积分在1800以上的对局、GGS上所有双方积分在2000以上的random对局,总共超过了100万个棋局。 估值强度还行,但没有Logistello强,8层对7层大概能打平手,人家毕竟是老牌程序,而且还在不断的自我学习中。     3、提高     第一个可以提高的地方是搜索深度,加入Multi-ProbCut相信可以使搜索加深几层,棋力应该可以提高。第二,增加一个好的开局库也可以大大的提高棋力。第三,估值模板也还可以继续训练和自我学习,随着训练和自我学习的继续,棋力还可能进一步提高。

 

黑白棋自我对局学习随想(续) 1、基本思想     黑白棋属于必定会结束的游戏,每一局都能知道最终比分。自我对局学习的思想就是从最终比分一步步的向前推,优化中局的估值函数。优化方法有很多,比如统计回归法,神经网络法,等等。说到底是一个结果反馈法。     这种学习方法基于大量的对局统计,比如每次学习100000个对局(我把这叫做学习周期)。再将一次对局分为多个阶段,这里举例来说分为中局和终局(比如16层)两个阶段。通过第一个学习周期的学习,估值函数在终局的参数就可以确定了,也就是说最后16步的估值函数参数都是可以确定的。他们是由最终结果来确定的,而且是可以反映实际的(注意并不是可以准确的预测结果,统计回归的方法只是拟合一个使得所有误差平方和最小的曲线,对于特定局面误差是一定会有的),因为在这16步内,程序是不会犯错误的。这句话的意思就是“如果已经进入了终局,程序的每一步走棋都和估值函数无关了,他们可以直接看到结果。”那么你可能要问“处在终局阶段的估值函数还有什么用?”答案是用他们来训练处在中局阶段的估值函数。在第二个学习周期结束时,处在中局阶段的估值函数可以根据处在终局阶段的估值函数来调整。比如中局搜索深度是4层,那么当距离终局还有4步时,搜索函数已经触及到了终局的开始处,这时处在终局阶段的估值函数也可以近似的看到结果(这里的误差来自处在终局阶段的估值函数的误差),而这个结果就返回到了距离结束还有20步的中局阶段。这样,终局前的4步也就可以近似的反映实际了。经过多个学习周期,这个近似可以一直延伸到开局。     这就是我的基本思想。下面再说说自我对局的生成。 2、生成对局     正常情况下,搜索算法总是返回最好的走法,但在自我对局学习中使用却行不通,因为这样会导致在一个学习周期内所有对局都完全一样,从而达不到学习的目的。解决方法有随机开局法和随机走棋法,或两者结合。     随机开局法就是说开始的N步不进行搜索,而是每一步都随机走,这样经过前N步后可以生成大量的不同局面,然后再按正常的方法搜索最佳步。就这种方法来说,前N步的估值函数优化没有意义,很容易出现某一步走差了导致最后输了,从而前几步即使是好的也会当成坏走法来优化了。这可以通过搜索深度加大来解决,如果搜索8层,那么开局第一步就已经搜索到了8步之后,这样最开始的7步无论怎样估值都无所谓了。     随机走棋法就是每一步走棋都是以一定的概率(比如0.3)走最好的棋,而剩下0.7的概率都走第二好的棋。这样也能生成大量不同的局面。这个方法看起来并不是很好,而实际上效果还是不错的。     这两种方案我都没有实际试验过,但我比较倾向于随机开局法。 3、解读Pandroid     Pandroid的方案是以上两种的结合体。他的自我学习模块叫做Borg,而Pandroid是可供使用的应用,但遗憾的是代码不完整(各个功能模块完整,缺少主程序,看懂后应该可以自己加上),因此无法测试学习的实际效果,只能通过估值误差来估计。     Borg的思想很有趣,它实际是两个程序在对局,一个充当教师,另一个充当学生,开始时教师和学生都是零知识的(只有估值模型,而没有任何估值知识)。每个学习周期为100000个对局。在每次对局的开始时Borg使用了开局8步随机的随机开局,而后,教师和学生的走棋风格就不同了,教师总是走它自己认为最好的棋,而学生则大部分情况下都不走它自己认为的最好的棋(这里就是随机走棋策略,但也不是乱走,而是走第二好、第三好等等)。而每11个对局中会有一个测试对局,用来评估。每经过一个学习周期,学生的估值函数就会调整,同时根据测试对局测试它的性能,如平均绝对估值误差等参数。如果学生在某个学习周期里的平均得分高于教师3分,则升级为教师,而原教师的知识就会被清空,变成一个新的零知识学生。如此循环下去。     对我来说,Borg的学习效果无法联入GGS进行评估,但据作者所说,效果不错,而我也在GGS上查询过Pandroid和se7en(7层中局+18层终局,和OO7一样,OO7是Logistello的7+18版本)的记录,的确很强,略差于OO7,看起来应该比我的要强一些。不知道作者训练了多少个周期,我在自己的计算机上训练了100个周期,最后5步的平均估值误差在8子左右,而在开局时则是18子左右。这个估值误差在开局时已经和Logistello相差无几了,不过终局时则差于Logistello。(Logistello的估值误差参见Buro的论文,由于Logistello也在不断的自我升级,所以估计现在他的棋力比以前要高不少了)面。这个方法看起来并不是很好,而实际上效果还是不错的。     这两种方案我都没有实际试验过,但我比较倾向于随机开局法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值