博弈算法实现简单五子棋

一、  问题介绍

实现交互式五子棋

采用博弈算法

二、  程序设计与算法分析

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
    评论
博弈搜索算法是一种常用于解决博弈问题的算法,其中五子棋是一个典型的博弈问题。下面是一个使用C语言实现博弈搜索算法五子棋代码[^1]: ```c #include <stdio.h> #include <stdlib.h> #define GRID_NUM 15 #define MAX_DEPTH 4 typedef struct { int x; int y; } Point; int IsGameOver(unsigned char position[][GRID_NUM], int nDepth) { // 判断游戏是否结束的逻辑 // ... } int Evaluate(unsigned char position[][GRID_NUM]) { // 评估当前局面的得分 // ... } int AlphaBetaSearch(unsigned char position[][GRID_NUM], int nDepth, int alpha, int beta, Point *bestMove) { if (nDepth == 0 || IsGameOver(position, nDepth)) { return Evaluate(position); } int i, j; int score; Point move; for (i = 0; i < GRID_NUM; i++) { for (j = 0; j < GRID_NUM; j++) { if (position[i][j] == 0) { position[i][j] = 1; // 假设当前玩家为1 score = -AlphaBetaSearch(position, nDepth - 1, -beta, -alpha, &move); position[i][j] = 0; if (score > alpha) { alpha = score; if (nDepth == MAX_DEPTH) { bestMove->x = i; bestMove->y = j; } } if (alpha >= beta) { return alpha; } } } } return alpha; } int main() { unsigned char position[GRID_NUM][GRID_NUM] = {0}; Point bestMove; AlphaBetaSearch(position, MAX_DEPTH, -10000, 10000, &bestMove); printf("Best move: (%d, %d)\n", bestMove.x, bestMove.y); return 0; } ``` 这段代码实现了一个基于博弈搜索算法五子棋程序。它通过递归地搜索所有可能的下子位置,并使用Alpha-Beta剪枝算法来提高搜索效率。在每一层搜索中,根据评估函数的得分选择最优的下子位置。最终,程序会输出最佳下子位置的坐标。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值