1. 前言
极小化极大算法是基于决策树和搜索的智能系统中的典型算法,可用于指导井字棋、黑白棋、五子棋等经典完全信息零和博弈。虽在学生时代学习过极小化极大算法,但时过境迁,思量该算法的来龙去脉已然如雾里探花水中望月。近来自学人工智能算法,恰好又一次接触到了该算法,也算与其有缘,理应将其悉数记下。下文将以井字棋为例详细说明该算法原理。
2. 博弈树
2.1 井字棋
井字棋(Tic-Tac-Toe)是由两个玩家轮流在3X3的格子上标记自己符号(圈或者叉)的游戏,最先以横、直、斜连成一线则获胜,如下图所示。
2.2 博弈树构建
以完全信息零和游戏“井字棋”为例,将每一个局面均视为一棵树上一个节点,每一个动作视为树上的边,因此“井字棋”游戏可以被完全展开成一棵树。一局游戏的发展过程是博弈树从根节点到叶结点的一条路径。井字棋的博弈树最高有9层,如下图所示(井字棋博弈树前3层)。
3. 估值函数
估值函数使用来给每一个局面给出一个估值,用判断博弈树中当前局面的形势。在传统的棋类游戏智能系统中,估值函数一般是人为指定的,对棋类游戏智能的水平有决定性作用。
估值函数的形式不是固定的,它的输入一般是一个局面的信息,输出是一个表明相应局面好坏程度的数值。为了说明极小化极大算法,本文中规定井字棋的估值函数为:玩家X还存在可能性的行、列、斜线数减去玩家O还存在可能性的行、列、斜线数。如图3所示,玩家X还存在可能性的行、列、斜线数为6,玩家O还存在可能性的行、列、斜线数为3,因此估值函数在图3局面下的输出为3。
4. 极小化极大算法
4.1 算法原理
在零和博弈中,玩家均会在可选的选项中选择将其N步后优势最大化或者令对手优势最小化的选择。将双方决策过程视作一颗决策树,若决策树某一层均为己方决策依据状态(即接下来是己方进行动作),则己方必定会选择使得己方收益最大化的路径,将该层称为MAX层。若决策树某一层均为对手决策依据状态(即接下来是对手进行动作),则对手必定会选择使得己方收益最小化的路径,将该层成为MIN层。由此,一个极小化极大决策树将包含max节点(MAX层中的节点)、min节点(MIN层中的节点)和终止节点(博弈终止状态节点或N步时的状态节点)。每个节点对应的预期收益成为该节点的minimax值。
对于终止结点, minimax值等于直接对局面的估值。对于max结点,由于max节点所选择的动作将会由己方给定,因此选择minimax值最大的子结点的值作为max结点的值。对于min结点,则选择minimax值最小的子结点的值作为min结点的值。
极小化极大算法过程可描述如下:
- 构建决策树;
- 将评估函数应用于叶子结点;
- 自底向上计算每个结点的minimax值;
- 从根结点选择minimax值最大的分支,作为行动策略。
minimax计算流程如下:
- 如果节点是终止节点:应用估值函数求值;
- 如果节点是max节点:找到每个子节点的值,将其中最大的子节点值作为该节点的值;
- 如果节点时min节点:找到每个子节点的值,将其中最小的子节点值作为该节点的值。
4.2 算法过程
如图4所示,假设玩家X可在井字棋游戏中向下思考3步,则其必定会选择3步后优势最大的落子策略。构建3层决策树如下,对于每一个叶结点,可运用上述估值函数得到叶结点对应局面的估值。
由于叶结点所在层的上一层到叶结点层的动作由玩家X作出,因此叶结点层上一层为MAX层。玩家X会选择使得己方局面最佳的落子方法,因此MAX层的节点的minimax值应该为下一层中最大的值。
同时,MIN层到MAX层的动作由玩家X的对手作出,因此MIN层的节点的minimax值应该为下一层中的最小值。
对于每一个叶结点,其minimax值可根据估值函数得出。对应每一个max节点或min节点,其值可根据上述规则得出。由此,可以得到整个决策树。
作出决策的目的是是的己方N步后的局面最佳,因此,从根结点选择minimax值最大的分支,作为行动策略。
5. 后记
最小化最大算法构造决策树,并自底向上计算每个节点的minimax值,最终从根结点选择minimax值最大的分支,作为行动策略。
当一个零和博弈双方每一步可选动作数量较多时,决策树会变得非常庞大,因此构造决策树,并对其进行遍历,求取每个minimax值将会非常耗时。
在决策树的构建与搜索过程中,存在一些不必要搜索的节点。如果不展开不必要搜索的节点,将会极大的节省搜索时间。
下文将讲解极小化极大算法的优化版本——AlphaBeta剪枝算法。
后文:Alpha-Beta剪枝算法原理