1)对于如图所示的博弈树,假若A在极大值层,它该选什么样的走步?
- 检查L点,更新 α ( E ) > = 7 \alpha(E)>=7 α(E)>=7
- 检查M点,确定 α ( E ) = 7 \alpha(E)=7 α(E)=7,更新 β ( B ) < = 7 \beta(B)<=7 β(B)<=7
- 检查N点,更新 α ( F ) > = 8 \alpha(F)>=8 α(F)>=8, α ( F ) > β ( B ) \alpha(F)>\beta(B) α(F)>β(B),F点进行 β \beta β剪枝
- 检查P点,更新 α ( G ) > = 2 \alpha(G)>=2 α(G)>=2
- 检查Q点,确定 α ( G ) = 3 \alpha(G)=3 α(G)=3,确定 β ( B ) = 3 \beta(B)=3 β(B)=3,更新 α ( A ) > = 3 \alpha(A)>=3 α(A)>=3
- 检查R点,更新 α ( H ) > = 0 \alpha(H)>=0 α(H)>=0
- 检查S点,确定 α ( H ) \alpha(H) α(H)=0,更新 β ( C ) < = 0 \beta(C)<=0 β(C)<=0, β ( C ) < α ( A ) \beta(C)<\alpha(A) β(C)<α(A),C点进行 α \alpha α剪枝
- 检查V点,更新 α ( J ) > = 5 \alpha(J)>=5 α(J)>=5
- 检查W点,确定 α ( J ) = 8 \alpha(J)=8 α(J)=8,更新 β ( D ) < = 8 \beta(D)<=8 β(D)<=8
- 检查X点,更新 α ( K ) > = 9 \alpha(K)>=9 α(K)>=9, α ( K ) > β ( D ) \alpha(K)>\beta(D) α(K)>β(D),K点进行 β \beta β剪枝,确定 α ( A ) = 8 \alpha(A)=8 α(A)=8
2)在上题的博弈树中,用剪枝过程需要检查哪些节点?
需要检查L、M、N、P、Q、R、S、V、W、X
-
有一种N/M或“最后者输”的博弈游戏,其玩法如下:开始有9枚硬币,两人轮流取出1、2或3枚,取出最后一枚者为输,试用搜索树证明后起步者总能取胜。
当轮到某一方时只剩下1个硬币,则该方输。
通过搜索树得知,当先手的局面剩5个硬币时,后手必胜,而无论先手在第一步时取走几个硬币,后手总能使先手在第二步决策时只剩下5个硬币。而在博弈过程中,双方总是做出对自己最有利的决策,因此无论先手做出什么决策,后手总能获胜。
实际上,当n=k(m+1)+1时,后手必胜。设先手取出x个物品,后手只需要取出m+1-x个物品,使得n整除m+1的余数为1,且后手方仍是后手方。以此类推直到n=1。即先手必败后手必胜。本题中n=9,m=3,n=2(3+1)+1,满足后手必胜条件。
1)请指出 α \alpha α剪枝过程与 β \beta β剪枝过程的差别。
- α \alpha α剪枝:若任一极小值层节点的 β \beta β值小于或等于他任一先辈的极大值层节点的 α \alpha α值,则可中止该极小值层中这个MIN节点以下的搜索过程(因为有比该节点更优的策略,已方不会选择该节点作为下一步策略),这个MIN节点最终的推导值就确定为这个 β \beta β值。
- β \beta β剪枝:若任一极大值层节点的 α \alpha α值大于或等于他任一先辈的极小值层节点的 β \beta β值,则可中止该极大值层中这个MAX节点以下的搜索过程(因为对方不会选择对己方更有利的策略),这个MAX节点最终的推导值就确定为这个 α \alpha α值。
2)极小极大过程体现了怎样的思想?
极小极大搜索体现了一种“零和博弈”的思想,博弈双方的目的都是极大化自己的利益,极小化对方的利益。己方考虑双方对弈若干步之后,从可能的步中选一步相对好的走法来走,即在有限的搜索深度范围内求解。
MAX代表己方,MIN代表对方,P代表局面。
静态估计函数 f 对局面的势态做出优劣估计,有利于MAX的势态,f§取正值;有利于MIN的势态,f§取负值。
- 当轮到MIN走步的节点时,MAX应该考虑最坏的情况,f§取极小值
- 当轮到MAX走步的节点时,MAX应该考虑最好的情况,f§取极大值
- 当评价往回倒退时,相应于两方的对抗策略,不同层上交替使用1、2两种方法向上传导倒退值。
T:=(s, MAX), Open:=(s), Closed:=();//生成初始博弈树
/*第一阶段:使用宽度优先搜索生成规定深度的全部博弈树,然后对其所有端节点计算其静态估计函数值*/
Loop1: // 扩展深度至d
if Open=( ) Then Goto Loop2
n:=First(Open), Remove(n,Open), Add(n,Closed)
if F(n)=-∞, +∞, 0, Then Goto Loop1 // 可以被判定
else {ni}:=Expand(n) , Add({ni},T)
if d(ni)<k Then Add(ni,Open), Goto Loop1
else 计算f(ni), Goto Loop1
/*第二阶段:从底向上逐级求非终节点的倒推估计值,直到求出初始节点的倒推值f(s)*/
Loop2: // 赋值
if Close=() Then Goto Loop3
else np:=First(Closed)
if (np Is MAX) And (f(npi)有值) // npi是np的子结点,且都有值
then f(np):=max f(npi), Remove(np,Closed)
if (np Is MIN) And (f(npi)有值) // npi是np的子结点,且都有值
then f(np):=min f(npi), Remove(np,Closed)
if np未被赋值, Then MoveTail(np, Closed)
Goto Loop2
/*第三阶段:根据f(s)选择相对好的走步*/
Loop3:
if f(s)有值then Exit(End or M(Move, T)) // s被赋值,结束该步
选择相对好的走步*/
Loop3:
if f(s)有值then Exit(End or M(Move, T)) // s被赋值,结束该步