原创 人工智能(五子连珠的探讨)

2012-3-13 19:13 1224 15 15 分类: 消费电子

  五字连珠是一个古老的游戏,从职业化的竞技的角度来看,五子连珠的激发有很多种,而其中又是富于变化的,正如围棋一样,在开始时空空如也的棋盘之上,我们用智谋搭建起一个一个的巧妙的局面,来努力获得成功。

  从这样的意义上来说,五子棋就是一门策略的战争,而策略,就是这场战争获胜的关键,我们知道,只要达到五字连珠,或者说,只要达到活四的局面,或是两个活三的局面,又或是一个活三一个冲四的局面,我们的胜局就把握了,软件上的实现总会有一些不如意,因为软件毕竟不是人(不是脏话,意思就是这个),但是正是这样的特点,我们也有了一个机会可以把这样的特点得到充分的利用,这个我会在后面的探讨中说到。

  如果说人工智能与硬件无关,你的想法可能是错的,硬件的目的,就是为特定的应用而服务,当然,软件是有机会来充分的发挥出硬件的能力的,而特定设计的硬件,可以使问题得到更为专业化的解决,通过硬件的特殊的饿设计,可以让我们的问题的解决得到良好的机会,但是在这里,我还是想在更高一些的层面上对五子棋的对策做出一些探讨。

  最终的目的只有一个,那就是获胜。那么,我们的一切的策略也就是为了胜利而来!从获胜的几个特定的阵法中,我们可以大概的在心中描绘出一幅获得胜利的圆满的场景,当然,我们的想象要真正获得实现,才是真生的大功告成!而在一切获胜之前,我们的所有的思维必须要能够冷静,通过严密的计算机的程序的设计,我们恰恰有可能获得这种胜利,从主要的获胜的方式上来看,有双活三,(当然,在此,我们暂时排除禁手的存在,也暂时排除在专业化的比赛中的某些禁止的开局,因为我们的水平暂时还没有到能够在专业化的比赛中露面呢!纯粹来个玩笑!)有活三加上冲四,有活四,暂时就这些,后面我们还可以加,其实也没有很多了。

  很多的时候我们之所以能赢,在很大的一部分的程度上是靠着之前的一些经验的,所以,如果我们设计的程序能够有这种学习能力,相信他的能力一定会非常的强悍。当然,这个在之后会提到。

  好了,首先,把主要的躯干部分搭建起来,从五子棋的期盼情况来看,15×15,并不是很大,这样的盘面情况可以用一个二维数组来进行操作,我们可以假定1代表黑子,而2代表白字,0则代表此位子上没有棋子,在一般的情况下,我们的数组是被初始化为没有棋子的,所以只有当我们落子后才会有相应的记录,而这里就是我们所有的可以参照的居民啊情况,这也是最完整的情况了,下面的事情就要靠许多的算法来进行了。

  既然是躯干的搭建,就首先要讲到防守,作为白棋走子方,电脑显然是不占优势的,至少在开局的时候是这样,而防守是这个时候最为合适的选择,对于防守来说,主要是防守黑棋方的可能获得胜利的局面,也就是可能的活三或是冲四,这是最常见的两种获胜的方法,当然,你也许会说,不是还有各种的精妙的赢棋套路吗?比如一个冲四和活三的组合就一定能赢,而我们就需要使我们的程序能够自啊这样的情况发生之前把它识别出来,当然,这个也不是很难,如果是在原来的想法,15×15的一个数组,我一定读整个棋盘做一番搜索,而且就电脑的处理速度而言,这个只是很少的时间,但是实际上我们并没有必要(或者说,很大的程度上是没有必要的)去读取和判断整个棋盘,试想,如果一开局当黑棋方只有下了一个子的时候我就需要这样来完成这个任务的话,那实在是有点浪费我们的电脑的大脑,当然,我想她不会介意的,后来的想法是,其实在通常的下棋的情况中,我们的对应前面的落子基本上是集中在黑棋之前的落点的周围的一个5×5的范围之内,而就这一点来说,我们就不需要再对所有的这么多的点来进行梳理,所以,在我们的程序中,这一点可以很好的做到,当然,着里面有一点要注意,就是对于边界的超出的检测。当然,这是编程上的具体的注意的细节,在这里不会去详细的涉及,所以不再详细的说明。

  那么,我们在前面的落点的范围估计以后就可以进行具体的防守和进攻了,首先是进攻,进攻的主题就是活三和一些冲四还有一些具体的定式,对于定式的解决想放到后面,这里就是主要对活三等的防守,这可以根据对方(也就是黑棋下子方)的落点进行判断,我们可以这样假设,当黑棋方向要进行进攻的时候,它必然会在落点的四周进行一些接近于定式的落子,可以进行一些判断,然后就可以成功的进行防守了。

  相信初步的防守已经实现了,好了,接下来,做一些进攻,首先,注意顺序,在五子棋的下子过程中,占据主动永远是赢得胜利的最重要的步骤,而如果想要占据主动,首先对局面需要有很好的预计,在防守之前,我们可以完成一个简单的局面判断,这是通过对在黑棋(先手)的落子范围中的空点(一般白棋的落点是在这里面的)进行依次的打分,是的,如果你想要选择出最好的下棋点,并且下出能够占据主动的棋法,你就要读局势进行一定的打分,这个打分的函数在这里显得尤为重要,实际上,在我个人感觉中,如果我们能够在这个函数的设计上加入更多的策略和精巧的算法,或许我们在后面的防守可能根本就不需要,所以说,在这个函数的设计上还是有很大的空间的,如果有兴趣的可以在这里进行深入的研究,当然,就我自己写的这个打分函数来说,还不够智能,具体的实现原理其实很简单,就是判断这个棋子对整个局面和下一个展开的局面的贡献,如果这个棋子可以连接到类似于活三或是冲四之类的能够让对方进行防守的局面,那么这一招必然是对我们有利的,而这就是我们要做的事情,而如果这个棋子同时又能够在对方(也就是黑棋方)的某个有可能形成活三或是冲四的局面上,那么同样也是有很大的贡献的,在实际的打分中,我们会给这两种不同的贡献打上不同的分数。实际上,在这种算法的引导下,我们的电脑还是有很明显的缺陷的,但是我现在对于这个问题的解决还是比较简单的,及通过后面的防守和主动的攻击来弥补,多亿这个问题并没有得到很好的解决,当然那这个问题是有解决的方法的,至于这个问题是啥,你可以运行程序一下就能够明显的看出来了。

前面说到各个的函数的设计及和摆放的位子,这个很重要,至少在我看来是很重要的,首先,我们可以通过自己设计的打分函数欲判出一个比较理想的下子位子,而在前面我也提到过,这样的给出的位子是有缺陷的,所以在这之后会用防守函数进行对方的攻击的招式的检测和相应的防守,这样如果有需要进行防守的地方,那么我们就会进行自动的防守,而在这里我要提醒你,其实实际上的防守的情况是有很多的,即使除去一些比较精巧的进攻的招式,我们还是有很多的常规的防守的判断要做出,当然,这与我们之前做的对于以黑棋落点为一个范围的空格中来进行下子的决定是有一定的关系的,这就好像我们在数学中常见的以直角(也就是X,Y轴的这种坐标表示方法),有些情况中,如果我们换用极坐标的其他的方式,或许这件事情会变得简单很多,这里也是值得我们去仔细思考的地方。

在防守之前,其实还可以有一步,那就是进攻,我们可以先做出进攻,如果可以通过主动的进攻来取得一个有利于我们的局面,那么又何乐而不为呢?

   其实在进攻的判断中,和防守还是有很多的相似的地方的,其实就好像是一种反转,那么具体的我就不再说了。

   好了,下面就是最最重要的地方了,如果是以前的情况,或许我到了这里就可以完成了,但是为了使我们的函数变得更加的强大,我们接下来的工作才是最最主要的贡献力量,如果要给他打分,或许这个权重更大!

  那么,这个部分就是定式的解析和记忆,这个是通过事先在文件中输入相关的局面图和相应的解法和对策来实现的,当然,这就需要很大量的数据和即为精巧的数据结构上的设计,这个也不是很难,关键在于在以后的走棋过程中,可以想出一个办法使得我们的电脑可以去尝试反转记忆可以获胜的多种走棋,那样棋力就会越来越强,这部分的代码还没有很好的完善,所以还是有很长的时间才能真正产生。

  实际上,在人工智能下棋的时候,在每一个阶段是应该使用不同的策略的,在开局的阶段,可以直接载入相应的定式开棋局,然后中盘利用前面形成的一定的优势通过主动的进攻和精巧防守的结合为主,来占据棋面的主动,最后在评分函数的指导下,直接落子,锁定胜局!这样我们的电脑才能真正做到百战百胜,当然,程序终究是人写的,所以还是有办法战胜的,着里面的道理就要慢慢去探究喽!

文章评论0条评论)

登录后参与讨论
我要评论
0
15
关闭 站长推荐上一条 /2 下一条