【五子棋AI】AI的基本结构——局面评价

来源:互联网 发布:网络教育专升本难度 编辑:程序博客网 时间:2024/06/11 16:30

         如何判断一个走法优劣?我们使用一个量化的形式,即一个分值,例如一种典型的情况:对方冲四,己方一穷二白,那么除了封堵点之外,其他点都导致输棋。从封堵过程来看,如果冲4分值为1000,那么走封堵之后,对方评价值将减少1000。这无疑是一个很好的评价方式。基于程序特点,我使用的评价方法并不是传统的评价当前有几个冲4,有几个活3,而是评价当前能形成几个冲4,能形成几个活3,即针对“冲棋点”进行评价而不是针对已有棋型进行评价,也许又是五子棋AI有别于象棋AI的一个显著特点。

         在前面介绍过程中已经说明将冲棋点按段排序,这样只需要遍历每个段取得个数(我也曾试验直接记录个数,但试验结果是那样做得不偿失),然后计算双方得分并做减法即可。在我的程序中,使用了一组没有经过严格论证的得分(额,说白了就是我瞎猜的),但一直没有出现什么大问题,这可能和分段排序有关。按棋型从低到高的给分分别是:

1、4、8、12、256、10、16、320、384、256、40960

10分的棋型是冲3,它前面是33  ,40960是连5或长连上的点的得分(这个是一个特殊情况,它不是冲棋点,前面那些都是空格的得分,而这个是棋子的得分)。

这样一来,就很容易给出一个评价函数(其中win_value=40960*32):



    Function Evaluate() As Integer

        If 对方连五(或长连) Return -ConstValue.WIN_VALUE 
        If 己方连五(或长连) Return ConstValue.WIN_VALUE


        If 己方可成5  return ConstValue.WIN_VALUE
        if 对方成5点有两个 return - ConstValue.WIN_VALUE


        For type = 本方冲1 to 本方成42

           统计类型个数
           EvaluateVal += 类型个数 * 类型得分
        Next

        For type = 对方冲1 to 对方成5

           统计类型个数
           EvaluateVal -= 类型个数 * 类型得分
        Next


        Return EvaluateVal
    End Function


这个函数使用了“提前剪裁”的想法,即前4行代码,需要注意的就是它们的先后顺序。当然为了程序更优,可以从更高棋型开始统计而不一定要从冲1,因为冲1本身就没有什么价值,我试验的结论是如果从冲2开始统计,则可以提高3-5%的效率并且也没有什么问题。

全部文章和源码整理完成,以后更新也会在下面地址:

http://www.vbdevelopers.org

http://www.softos.org