博弈树
就是游戏的状态空间。拿井字棋举例,很直观就能看懂。
稍微解释一下,首先树的叶子节点代表游戏的某个结局,1代表获胜,0代表平局,-1代表失败。(对于一号玩家而言)对于更复杂的游戏会有不同的评价方式,比如说围棋一盘结束后可以用黑白棋子占据位置的差值作为评价分数。
MAX和MIN代表两个玩家,某层为MAX代表此轮由他操作。之所以选择这两个名字,是因为MAX玩家总希望评价分数最高,MIN玩家则相反。也就是说如果确定每个结点的分数,他们的决策是一定的。
MIN-MAX算法
从整颗树倒推,上一层如果是MAX玩家,一定会希望取得最好的分数,用子结点中最大的数字更新上一层就行,MIN玩家也是同样,递归以下就出来了(其实是一种dp的思想)
但是对于状态空间非常大的游戏来说,想遍历整棵树是不可能的,所以我们需要更好的搜索策略。
α \alpha α- β \beta β剪枝
搜索过程中维护能得到的分数范围,
α
\alpha
α代表最小值,
β
\beta
β代表最大值。max层总会更新
α
\alpha
α,代表自己能至少选到多大的数字,对某个max节点来说
β
\beta
β永远为正无穷,因为还有可能在下一棵子树搜到更大的,但是之前搜索到的
β
\beta
β也会被参考,当你找到一个
α
\alpha
α比之前的
β
\beta
β还大时,说明你的上层min一定会选择另一条路而不是你,再搜索也就没有意义了。也就是说max节点的搜索有意义反而是当他不够大的时候。
对于min也是同理。
行棋排序
就是希望选择更优秀的节点遍历顺序,使得 α \alpha α- β \beta β剪枝速度更快。比如说围棋,优先选择吃子、包围之类的操作,使得搜索速度更快。
不完美实时决策
上面所有的算法都是完备的,但是搜索空间太大,实际操作起来基本不可行。需要一些启发式的算法。
向前剪枝
利用先验进行剪枝,比如规定几步“好棋”,进行搜索。但是很可能会避开最优解,于是存在有概率性的选择剪枝对象。
搜索查表
就是认为构造几种特定情况(残局),把棋局变成这种状态后面再根据表走。就是人为提前处理出几种很难走的情况。
随机博弈
存在概率性的博弈游戏,可以通过计算期望来进行搜索。评价函数构建方法很多,比如说自己和自己反复下棋,然后一方赢了就给经过的棋谱+1分,类似这样反复模拟的蒙特卡洛仿真。
部分可观察博弈
比如看不到对面手牌的游戏,很玄学。