初学人工智能导论的时候写了一个五子棋博弈的小程序,今天整理下思路写在这里,欢迎大神的指点。
五子棋博弈程序有很多,传统的基于规则的方法大都是对不同的棋型赋予不同的权值,用固定的函数评价当前的棋局,并结合博弈树的α-β剪枝来实现。这种实现方法的效果很依赖于权值的确定,对设计者的经验要求较高。如果我们采用一个动态的估值函数来评价棋局,让它能在对弈过程中不断成长,或许会有更好的效果。出于这种想法,我们可以选择采用神经网络来做评价函数。
接下来的问题就是我们要采用什么样的网络,网络的拓扑结构如何,采用什么样的学习方式?我最终选择了有一个隐含层的多层感知器的结构,先对棋局进行特征提取,然后将特征作为网络输入,输出一个数值作为对当前局势的估值。确定了网络结构,接下来就是确定如何学习的问题,TD强化学习算法使我受到了启发。我们显然不能用BP网络的的学习方式,因为我们不能准确给定每个局面的正确估值(如果我们有能力做到这一点,也就不用使用神经网络了),但是我们能够确定最后一个局面的估值应该是多少。如果最后自己输了,则估值为-1,赢了估值为1。和棋的时候不进行学习。(选用正负1作为标准输出是因为采用了线性激活函数,不能使用正负无穷)我们也不能只对最后一个局面进行学习,我们希望能够对每个局面都进行学习,那么我们能不能根据这个最后的局面给出前面若干个局面的合理估值呢?我们做这样的假设:在开始的时候,双方优势相当,评估值应为0,然后随着对弈,优势逐渐改变