博弈算法实现简单五子棋

本文介绍了如何使用博弈算法实现简单的五子棋游戏。详细探讨了博弈问题的特性,包括五子棋属于博弈问题的原因。文章讲解了与或图搜索法的基本概念和局限性,重点介绍了极大极小搜索算法及其优化方法——alpha-beta剪枝。通过极大极小搜索配合alpha-beta剪枝,有效减少了搜索空间,提高了搜索效率。最后,针对五子棋的特性,讨论了算法的实现细节,如使用HashSet进行高效搜索,并通过评估函数对棋局打分,以及结合图形界面展示游戏进程。
摘要由CSDN通过智能技术生成

一、  问题介绍

实现交互式五子棋

采用博弈算法

二、  程序设计与算法分析

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)

  • 4
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值