闲聊AlphaGo的AI算法

2016-03-11 17:19阅读:
我上大学的时候也是AI迷,曾用C语言写过一个五子棋的AI对弈程序,能下赢五子棋新手,做法是搜索树加剪支,虽然五子棋也是19*19的棋盘,但是算法简单很多,因为
1、不可能乱下,比如和现在的棋间隔三个子以上,就可以认为不合理,不去计算。
2、乱下很快会输,比如人家冲4你不堵,直接就输,只要遇到输的情况,搜索树就可以剪枝了。
但围棋和五子棋不一样
1、围棋可以落的子很多,你可以说这么走不合理,但是一定会输吗,也不一定。
2、围棋很难剪枝,因为双方乱下,也不会很快输棋,你认为差棋,也许是虚竹自填一目的好棋呢?
3、不能算的太浅,如果和职业选手对弈,不向后计算50步,就说不上算力。
这就导致搜索树叶子太多了,全遍历估计要几百亿年都算不出来。
安全剪枝不行,能不能非安全剪枝?也就是放弃最优下法,只要战胜对手就行,毕竟人类在下棋的时候,第一步不会考虑361种落子变化。
好了,那就模拟人的思维,做一个走棋程序,把意图分几类,比如局部定型,攻杀,抢大场,围空,打入,浅消等,然后针对当前局面,把选择点缩小到几十步,而向下搜索的时候,可以进一步减少选择范围,毕竟人类在下棋的时候,第一步的变化会想的很多,但是十几步以后的选择,估计也就是几种选择。
这样大大减少了搜索树的叶子节点。
但这样还是有问题,因为这个走棋程序是人想出来的,很可能不完善,设计者觉得电脑应该在这10步中选择,也许对于高手来说就是愚蠢,为了解决设计者自身水平影响棋力,增加学习程序,如下
1、同时搞N个走棋程序,模拟各种高手的走法。
2、每个走棋程序,设置M个参数,模拟某个高手对类似棋的不同应变。
这样就出来M*N个走棋风格,通过电脑互相下棋,把不合理的M和N淘汰掉
但我想最后留下的M和N,应该还会有很多个,是不是还有判断程序,在合适的盘面选择合适的M和N,比如盘面领先,就选择保守类的M和N来守卫胜利,而盘面落后,就选择攻击类的M和N来决胜负,似乎Alpha Go有遇强则强的特征。