您的位置:首页 > 理论基础 > 计算机网络

基于人工神经网络的五子棋博弈(转载请注明出处!)

2016-03-06 15:10 351 查看
初学人工智能导论的时候写了一个五子棋博弈的小程序,今天整理下思路写在这里,欢迎大神的指点。
五子棋博弈程序有很多,传统的基于规则的方法大都是对不同的棋型赋予不同的权值,用固定的函数评价当前的棋局,并结合博弈树的α-β剪枝来实现。这种实现方法的效果很依赖于权值的确定,对设计者的经验要求较高。如果我们采用一个动态的估值函数来评价棋局,让它能在对弈过程中不断成长,或许会有更好的效果。出于这种想法,我们可以选择采用神经网络来做评价函数。
接下来的问题就是我们要采用什么样的网络,网络的拓扑结构如何,采用什么样的学习方式?我最终选择了有一个隐含层的多层感知器的结构,先对棋局进行特征提取,然后将特征作为网络输入,输出一个数值作为对当前局势的估值。确定了网络结构,接下来就是确定如何学习的问题,TD强化学习算法使我受到了启发。我们显然不能用BP网络的的学习方式,因为我们不能准确给定每个局面的正确估值(如果我们有能力做到这一点,也就不用使用神经网络了),但是我们能够确定最后一个局面的估值应该是多少。如果最后自己输了,则估值为-1,赢了估值为1。和棋的时候不进行学习。(选用正负1作为标准输出是因为采用了线性激活函数,不能使用正负无穷)我们也不能只对最后一个局面进行学习,我们希望能够对每个局面都进行学习,那么我们能不能根据这个最后的局面给出前面若干个局面的合理估值呢?我们做这样的假设:在开始的时候,双方优势相当,评估值应为0,然后随着对弈,优势逐渐改变,直到决出胜负。我们假设局势是渐变的,这样我们就可以从最后的局面开始,逐步向前进行学习。对每个局面的学习,根据误差逆传播原理,进行一次权值的调整(这不算BP学习,只是采用了
BP学习的传播方式,进行一次强化学习),接下来我们要确定每个局面的误差。我们假设误差为e,期待输出为a,网络输出为f(),第n个局面为结局且记为An,这样,对于An的误差e
=a-f(An),进行一次学习,调整了权值之后,若再对An进行计算,得到f ’(An),这个值会比f(An)更接近a。对于前一个局面An-1的学习,我们不能准确知道它的期待输出为多少,但我们根据假设知道,它应该是一个接近于a的值,我们不妨选用f ’(An)作为An-1的期待输出。这样依次类推,就能完成整个学习过程,学习完一盘棋局,我们的网络对这局的每个局面的估值比原先的估值更为接近预期。
在我实践的过程中,发现算法的初始表现不佳,因为我实现的时候没有其他可用的博弈程序,也没去网上找,只能自己和它下,所以为了增强它的初始效果,我后面又加了一些规则判断,用于判断必胜局和死局(这样的局面估值是可以确定的,也不需要用神经网络,如果这里用神经网络,肯定没有规则效果好,也违背了我们使用神经网络的初衷)。
当时测试的时候也是自己和它下的,后来由于其他事情也一直没再做和其他程序对弈的测试。最近有时间的话我会优化一下程序,并封装到 dll 中,具体实现细节和相关源码感兴趣的朋友可以去我的 git 上查看。今天写在这里希望能与和自己一样的初学者分享自己的思路,也欢迎大神们的指点。
git:https://github.com/jimth001/my-Gobang-game-base-AI-algorithm.git
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: