AI中研究的博弈,即如何根据当前的棋局,选择对自己最有利的一步棋 ?
博弈的特点:
双方的智能活动,任何一方都不能单独控制博弈过程,而是由双方轮流实施其控制对策的过程。
博弈问题的表示:
用博弈树来表示,它是一种特殊的与或图。节点代表博弈的格局(即棋局),相当于状态空间中的状态,反映了博弈的信息。 与节点、或节点隔层交替出现。
为什么与节点、或节点隔层交替出现?
假设博弈双方为:MAX和MIN
在博弈过程中,规则是双方轮流走步。在博弈树中,相当于博弈双方轮流扩展其所属节点。
从MAX方的角度来看:所有MIN方节点都是与节点
理由: 因为MIN方必定选择最不利于MAX方的方式来扩展节点,只要MIN方节点的子节点中有一个对MAX方不利,则该节点就对MAX方不利,故为“与节点”。
从MAX方的角度来看:所有属于MAX方的节点都是“或节点”
理由: 因为扩展MAX方节点时,MAX方可选择扩展最有利于自己的节点,只要可扩展的子节点中有一个对已有利, 则该节点就对已有利。
在博弈树中,先行一方的初始状态对应树的根节点,而任何一方获胜的最终格局为目标状态,对应于树的终叶节点(可解节点或本原问题)。但是,从MAX的角度出发,所有使MAX获胜的状态格局都是本原问题,是可解节点,而使MIN获胜的状态格局是不可解节点。
博弈的例子:
初始状态:包括棋盘局面和确定该哪个游戏者出招;
后继函数:返回(move, state)的一个列表;(move是合法招数,state是招数move所导致的状态)
终止测试:判断游戏是否结束;结束的状态称为终止状态
目标函数:对终止状态给出一个数值。
例:井子棋游戏
例:Grundy博弈-分配物品问题
如果有一堆数目为N的钱币,由两位选手轮流进行分配,要求每个选手每次把其中某一堆分成数目不等的两小堆,直至有一选手不能将钱币分成不等的两堆为止,则判定这位选手为输家。
用数字序列加上一个说明来表示一个状态:
(3, 2, 1, 1, MAX)
数字序列:表示不同堆中钱币的个数
说明:表示下一步由谁来分,即取MAX或MIN
现在取N=7的简单情况,并由MIN先分
对于比较复杂的博弈问题,只能模拟人的思维“向前看几步”,然后作出决策,选择最有利自己的一步。即只能给出几层走法,然后按照一定的估算办法,决定走一好招。
极大极小算法 Minimax algorithm
例: 井字棋
e(s) = 对MAX开放的行,列,对角线数量 - 对MIN开放的行,列,对角线数量
值的回推
深度为2的搜索树
极大极小算法
伪代码:
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 <- -INF
for a,s in SUCCESSORS(state) do v<-MAX(v,MIN-VALUE(s))
return v
function MIN-VALUE(state) returns a utility value
if TERMINAL-TEST(state) then return UTILITY(state)
v <- INF
for a,s in SUCCESSORS(state) do v<-MIN(v,MAX-VALUE(s))
return v
博弈过程 (MAX):
到达最终状态前重复以下步骤
注意:每一回合建造深度为h的博弈树仅为选择当前的一步走棋,下一个回合重复所有的步骤(上一回合中深度为h-2的子树可以拿来重复使用)
极大极小搜索过程由两个完全分离的步骤组成:
缺点:这种分离使得搜索的效率比较低。
还能做得更好吗?
是的 ! 能够做得更好 !
例子:
改进:在博弈树生成过程中同时计算端节点的估计值及倒推值,以减少搜索的次数,这就是α-β过程的思想,也称为α-β剪枝法。
α-β 剪枝:
α-β 剪枝的思想:如果m比n好,我们就不会走到n。
例:
α-β
α-β 剪枝:
伪代码:
function ALPHA-BETA-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,alpha,beta) returns a utility value
inputs: state, current state in game
alpha, the value of the best alternative for MAX along the path to state
beta, the value of the best alternative for MIN along the path to state
if TERMINAL-TEST(state) then return UTILITY(state)
v <- -INF
for a,s in SUCCESSORS(state) do
v<-MAX(v,MIN-VALUE(s,alpha,beta))
if v >= beta then return v
alpha <- MAX(alpha,v)
return v
function MIN-VALUE(state,alpha,beta) returns a utility value
same as MAX-VALUE but with roles of alpha,beta reversed
处理搜索树中的重复状态
例如,[a1, b1, a2, b2]和[a1, b2, a2, b1]都结束于同样的棋局,其中[b1, b2]是[b2,b1]的调换。
实战:https://blog.csdn.net/u014296991/article/details/105618765
国际象棋中EVAL通常取为加权线性函数(假设每个特征的贡献独立于其它特征的值)
评价函数应该只用于那些静止的棋局(近期不会出现大的变化的棋局),非静止的棋局可以进一步扩展直到静止的棋局,这种额外的搜索称为静止搜索。
残局库类型
残局库生成
注:主要内容来自巢文涵老师的人工智能课