哈哈,第六课:博弈、极小化极大、α-β
计算机是怎么下象棋的?
让我们分析下面几种方法:
1.像人一样采用分析、策略、战术来得出下一着怎么走。这样没法实现。
2.使用if-then规则,这不是很好的设计方式。
3.往前看(一着)并进行评估。
ps:对形势的评估机制,比如静态值,往往可以用线性多项式进行表示。
4.大英博物馆算法,不行。
5.尽量往前看并进行评估,这就是我们的最终做法。
介绍两个术语:
关于象棋下一步如何移动的树,其下一步的移动的选择数量称为分支因子b,树的深度d。
继续说如何做
这种方法是极小化极大算法minimax,通俗说就是在博弈树上一层取大,一层取小。
α-β算法是对极小化极大的改进,α-β和minimax得到的结果完全相同,α-β是对minimax的优化,也就是剪枝,这种剪枝能实现深层剪枝,通过跟和叶的比较可以剪去较多的枝,在层数大的时候优势更加明显。
使用了α-β算法需要的评估数大概是:
关于这个式子,可以这么理解,如果没用α-β算法,我可以达到7层,用了α-β算法可以到14。或者说不用α-β要做的工作多了平方根个数量级。
所以能用α-β的时候一定要用。
最后的问题:
我们假设分支因子是一样的,而在实际情况中,分支因子是不确定的。这会导致有的时候三秒钟就算出了下一步怎么走,有的时候几分钟还没有想好(b太大了),如果时间到了,只能做一个随机的决定。
为了解决这个问题,在分支因子过大的情况下,可以不算第d层,算到第(d-1)层,如果还不行,那就继续往上减少计算的层数。
如果分支因子为10,少算最底一层计算量就是原来的10%
所以我们可以每算一层就得到一层的结果。
这一思路叫做逐步深入progressive deepening。
总结一下思路:
死马原则:α-β体现出来,不需要的枝就是死马,抛弃掉。
逐步深入的真个思路是anytime algorithm很好的例子,我们可以在任何时间得到一个当时可以提供的最佳答案。
博弈程序一般就是如上设计的。
这些跟Deep Blue(IBM国际象棋电脑)有多大不同呢?没有多少。
Deep Blue=极小化极大+α-β+逐步深入+并行计算+开局库+用于残局的算法+非均树创建uneven tree development
我想加上开局库和残局算法是因为象棋的开局和一些残局都有固定的走法,不需要再计算。
但是,这样就是智能了吗?
部分是部分不是,因为人也会面临各种各样的博弈。但是人在下棋的时候不会像计算机一样考虑到14层,人会记住很多定式,一个象棋大师可以记住一个有章法的棋局,而杂乱无章随机摆放的棋局则很难记住。这样的智能是推土机式的智能,并不完全相同于人脑的智能,它只是用原始的力量弥补智慧的不足。