一、 问题介绍
实现交互式五子棋
采用博弈算法
二、 程序设计与算法分析
l 博弈问题简介:
– 双人对弈,轮流走步。
– 信息完备,双方所得到的信息是一样的。
– 零和,即对一方有利的棋,对另一方肯定是不利的,不存在对双方均有利或无利的棋。
l 博弈的特性:
– 两个棋手交替地走棋 ;
– 比赛的最终结果,是赢、输和平局中的一种;
– 可用图搜索技术进行,但效率很低;
– 博弈的过程,是寻找置对手于必败态的过程;
– 双方都无法干预对方的选择。
l 结论:五子棋问题属于博弈问题。
l 博弈问题的两种常用算法思路:
– 与或图直接搜索法:搜索枚举双方棋手的下棋方法,构建与或图直接搜索出答案 ;
u 与或图简介:
与或图是一个超图,节点间通过连接符连接。
u 与或图节点分类:
n 能解节点:
Ø 终节点是能解节点
Ø 若非终节点有“或”子节点时,当且仅当其子节点至少有一能解时,该非终结点才能解。
Ø 若非终节点有“与”子节点时,当且仅当其子节点均能解时, 该非终节点才能解。
n 不能解节点
Ø 没有后裔的非终节点是不能解节点。
Ø 若非终节点有“或”子节点,当且仅当所有子节点均不能解时, 该非终节点才不能解。
Ø 若非终节点有“与”子节点时,当至少有一个子节点不能解时, 该非终节点才不能解。
u 与或图搜索算法:
n 1.建立搜索图G:=s,计算q(s)=h(s), If Goal(s)Then M(s, Solved)
n 2.Until S 被标记为Solved, Do:
n 3.Begin ;扩展
n 4.G’:= Find(g) ; G’为根据连接符找到的待扩展局部解图
n 5.n := G’中任一非终结点
n 6.{nj}:=Expand(n), 计算q(nj)=h(nj),If Goal(nj) Then M(nj,solved)
n 7.S:={n} ;回溯,修改指针和耗散值
n 8.Until S为空, Do:
n 9.Begin
n 10.Remove(m, S) If m的子结点不在s中 ;子结点耗散值已确定 3/21/2014 第二章 与或图搜索
n 11.修改m的耗散值: 对m的每个连接符i{n1i,n2i,...,nki},计算qi(m)=Ci+q(n1i)+...+q(nki)q(m):=min qi (m) 修改m的指针到min qi (m)对应的连接符上 If(nji,Solved) THEN M(m,Solved) ;某一个连接符已解决
n 12.If M(m,Solved) or q(m)被修改 Then Add(ma,S), ma为m的所有先辈节点
n 13.End
n 14.End
u 两个过程:
n 图生成过程,即扩展节点,从最优的局部途中选择一个节点扩展
n 计算耗散值的过程 – 对当前的局部图从新计算耗散值
u 算法实现:
n 终结点为某一方胜利的状态:可用true或者false分别标记胜负
n 利用与或图搜索更新到根节点
n 若根节点为false表示当前棋局状态为必败情况。
n 若根节点为true表示当前棋局为必胜状态。
n 根节点总是尽量选择状态为true的子节点进行状态转移。
u 算法局限性:
n 搜索的没一层都要穷举所有可能的情况,很容易引起组合爆炸的问题。
– 极大极小搜索算法:利用优先深度的搜索,通过对局势进行评估来选择状态转移的方向。
u 极大极小搜索简介:
n 下棋的双方是对立的;
n 一方为“正方”,这类节点称为“MAX”节点;
n 另一方为“反方”,这类节点称为“MIN”节点;
n 正方从所有子节点中,选取具有最大评估值的节点进行状态转移;
n 反方从其所有子节点中,选取具有最小评估值的节点惊醒状态转移;
n 反复进行这种选取,就可以得到双方各个节点的评估值。这种确定棋步的方法,称为极大极小搜索法。
u 对各个局面进行评估:
n 评估的目的:对后面的状态提前进行考虑,并且以各种状态的评估值为基础作出最好的走棋选择。
n 评估的方法:用评价函数对棋局进行评估。赢的评估值设为+∞,输的评估值设为-∞,平局的评估值设为0。
n 评估的标准:由于下棋的双方是对立的,只能选择其中一 方为评估的标准方。 所有评估站在正方的立场!
u 极大极小搜索算法:
n 1.T:=(s,max), Open:=(s),Close:=();
n 2.Lopp1: ;扩展深度至d
n 3.If Open=() Then Goto Loop2
n 4.N:=First(Open),Remove(n,Open), Add(n,Close)
n 5.If F(n)=-∞, +∞, 0, Then GotoLoop1 ; 可以被判定
Else {ni}:=Expand(n), Add({ni},T)
If d(ni)<kThen Add(ni,Open), Goto Loop1
Else 计算f(ni), Goto Loop1
n 6.Loop2: ;赋值
n 7.If Close=() Then Goto Loop3
Else np:=First(Close)
n 8.If (np Is Max) And (F(npi)有值) ; npi是np的子结点,且都有值
Then f(np):=maxf(npi), Remove(np,Close)