1. 极小极大值算法
人工智能中 "博弈" 通常专指博弈论专家们称为有完整信息的、确定性的、轮流行动的、两个游戏者的零和游戏(如国际象棋)。术语中,这是指在确定的、完全可观察的环境中两个 Agent必须轮流行动,在游戏结束时效用值总是相等并且符号相反。例如下国际象棋,一个棋手贏了,则对手一定是输了。正是 Agent 之间效用函数的对立导致了环境是对抗的。
博弈的游戏通常被 AI 作为一个好的问题来进行研究主要是因为:
- 玩家需要向人一样的智慧
- 游戏可能非常复杂(如象棋、围棋)
- 需要在一定的时间限制内做出决策
- 游戏是容易被定义的而且可以重复
- 游戏完全可观察并且有有限的环境
- 可以直接将人与AI进行比较
以井字棋为例我们可以得到下面的博弈树:
通过以上博弈树可以得知游戏的终止会有两种结果MAX得到+1,MIN就会是-1,MAX是-1,MIN就会是+1,也就是一名玩家最大化结果,另一名玩家的结果就会最小。
假设两个玩家(MAX为计算机、MIN为其对手)都发挥最佳效果,那么在计算机移动后,对手将选择最小化(但对于对手来说是最有利的操作)的移动,由此可得计算机应在考虑其移动和对手的最佳移动的情况下选择最佳移动,如下图所示:
如上图所示计算机在根节点有四种选择方式,每种选择之后其对手又有不同种选择方式,在其对手选择完成后就会进入终止状态产生结果,计算机 (MAX) 为确保自己所获利益最大,应当选择B、C、D、E中最大的值,因为对手 (MIN) 总会选择对自己最有利的决策,所以B值的由来是F、G中的最小值、C的由来是H、I、J的最小值,由此就可以得到了极小极大值的算法,极小代表的是在计算机 (MAX) 决策后其对手 (MIN) 总会选择对于计算机 (MAX) 来说获利最小的操作,极大值代表的是计算机 (MAX) 需要在所有的决策中(所有的极小值中),选择最大的值,通过以上分析可得运用递归的方法是比较容易实现以上操作的,具体伪代码如下:
cpp
function MINIMAX_DECISION(state) returns an action
inputs: state,current state in game
return the a in Actions(state) maximizing MIN-VALUE(RESULT(a,state))
function MAX-VALUE(state) returns a utility value
if TERMINAL-TEST(state) then return UTILITY(state)
v = -∞
for a,s in SUCCESSORS(state) do
v = MAX(v,MIN-VALUE(s))
function MIN-VALUE(state) returns a utility value
if TERMINAL-TEST(state) then return UTILITY(state)
v = ∞
for a,s in SUCCESSORS(state) do
v = MIN(v,MAX-VALUE(s))
从如上代码中可以得到 MAX-VALUE 函数与 MIN-VALUE 函数相互调用,通过深度优先搜索与逆向的归纳实现了极小极大值算法流程。
2. α-β剪枝
假设有如下博弈搜索树:
其正常的深搜顺序如下所示:
但根据极小极大值算法来看,我们发现有些搜索是没有必要进行的,请看以下分析:
查看上图得知,MAX已完成了对第一个子节点的搜索,此时 MAX 在未搜索到其它节点的情况下的选择应该是大于等于3的 (目前所得到的极小极大值为3)。
继续对第二个子节点进行搜索,但在第二个子节点的孩子节点搜到 2 时,我们就得知第二个子节点的值只会 ≤2 ,比第一个节点的值要小,因为我们要在所有子结点中选择最大值,因此在搜完第二个子节点的 2 节点之后,第二个子节点的孩子节点就没有搜索的必要了。
但如果在搜索第三个节点时搜索到了值为 14 的节点,剩余的节点是还要继续搜索的,因为我们不知道第三个子节点的最小孩子节点是多少,所以需要继续搜索。
以上过程只是展示了 MAX 在搜索中的剪枝过程,同理我们也可以得到 MIN在搜索时,也可以利用同样的优化方案,此时我们就可以得到 α-β 剪枝的伪代码:
cpp
function ALPHA-BETA-SEARCH(state) returns an action
v = MAX-VALUE(state,-∞,+∞)
return the action in ACTIONS(state) with value v
function MAX-VALUE(state,α,β) returns a utility value
if TERMINAL-TEST(state) then return UTILITY(state)
v = -∞
for each a in ACTIONS(state) do
v = MAX(v,MIN-VALUE(RESULT(s,a),α,β))
if v ≥ β then return v
α = MAX(α,v)
return v
function MIN-VALUE(state,α,β) returns a utility value
if TERMINAL-TEST(state) then return UTILITY(state)
v = +∞
for each a in ACTIONS(state) do
v = MIN(v,MAX-VALUE(RESULT(s,a),α,β))
if v ≤ α then return v
β = MIN(β,v)
return v
其中 α 表示到目前为止路径上发现的 MAX 的最佳 (即极大值) 选择,β表示到目前为止路径上发现的 MIN 的最佳 (即极小值) 选择。