博弈树的启发式搜索
实验二:利用α-β搜索过程的博弈树搜索算法编写一字棋游戏

实验二:利用α-β搜索过程的博弈树搜索算法编写一字棋游戏(3学时)一、实验目的与要求(1)了解极大极小算法的原理和使用方法,并学会用α-β剪枝来提高算法的效率。
(2)使用C语言平台,编写一个智能井字棋游戏。
(3)结合极大极小算法的使用方法和α-β剪枝,让机器与人对弈时不但有智能的特征,而且计算的效率也比较高。
二、实验原理一字棋游戏是一个流传已久的传统游戏。
游戏由两个人轮流来下,分别用“X”和“O”来代替自身的棋子。
棋盘分9个格,双方可以在轮到自己下的时候,可以用棋子占领其中一个空的格子。
如果双方中有一方的棋子可以连成一条直线,则这一方判胜,对方判负。
当所有的格子都被占领,但双方都无法使棋子连成一条直线的话,则判和棋。
这是一个智能型的一字棋游戏,机器可以模拟人与用户对弈。
当轮到机器来下的时候,机器会根据当前棋局的形势,利用极大极小算法算出一个评价值,判断如何下才对自身最有利,同时也是对方来说对不利的,然后下在评价值最高的地方。
另外利用α-β剪枝,使机器在搜索评价值的时候不用扩展不必要的结点,从而提高机器计算的效率。
在用户界面方法,用一个3×3的井字格来显示用户与机器下的结果。
当要求用户输入数据的时候会有提示信息。
用户在下的过程中可以中途按下“0”退出。
当用户与计算机分出了胜负后,机器会显示出比赛的结果,并按任意键退出。
如果用户在下棋的过程中,输入的是非法字符,机器不会做出反应。
三、实验步骤和过程1.α-β搜索过程在极小极大搜索方法中,由于要先生成指定深度以内的所有节点,其节点数将随着搜索深度的增加承指数增长。
这极大地限制了极小极大搜索方法的使用。
能否在搜索深度不变的情况下,利用已有的搜索信息减少生成的节点数呢?设某博弈问题如下图所示,应用极小极大方法进行搜索MINIMAX过程是把搜索树的生成和格局估值这两个过程分开来进行,即先生成全部搜索树,然后再进行端节点静态估值和倒推值计算,这显然会导致低效率。
《人工智能基础》名词术语

1,AI:AI是人工智能英文单词Artificial Intelligence的缩写。
2,人工智能:人工智能是研究如何制造出人造的智能机器或智能系统,来模拟人类智能活动的能力,以延伸人们智能的科学。
3,产生式系统:产生式系统是Post于1943年提出的一种计算形式体系里所使用的术语,主要是使用类似于文法的规则,对符号串作替换运算。
到了60年代产生式系统成为认知心理学研究人类心理活动中信息加工过程的基础,并用它来建立人类认识的模型。
到现在产生式系统已发展成为人工智能系统中最典型最普遍的一种结构,例如目前大多数的专家系统都采用产生式系统的结构来建造。
产生式系统由综合数据库、一组产生式规则(规则集)和一个控制系统(控制策略)三部分组成,称为产生式系统的三要素。
4,产生式系统的三要素:产生式系统的三要素是综合数据库、一组产生式规则(规则集)和一个控制系统(控制策略)。
5,产生式规则:产生式规则是知识表示的一种形式,其形式如下: IF <前件> THEN <后件> 其中规则的<前件>表达的是该条规则所要满足的条件,规则的<后件>表示的是该规则所得出的结论,或者动作。
规则表达的可以是与待求解的问题有关的客观规律方面的知识,也可以是对求解问题有帮助的策略方面的知识。
6,八数码游戏(八数码问题):八数码游戏(八数码问题)描述为:在3×3组成的九宫格棋盘上,摆有八个将牌,每一个将牌都刻有1-8八个数码中的某一个数码。
棋盘中留有一个空格,允许其周围的某一个将牌向空格移动,这样通过移动将牌就可以不断改变将牌的布局。
这种游戏求解的问题是:给定一种初始的将牌布局或结构(称初始状态)和一个目标的布局(称目标状态),问如何移动将牌,实现从初始状态到目标状态的转变。
7,传教士和野人问题(M-C问题):传教士和野人问题描述为:有N个传教士和N个野人来到河边准备渡河,河岸有一条船,每次至多可供k人乘渡。
搜索(博弈树的启发式搜索)

15
S0
S1 -1
S2 1
S3 -2
S4
S5
6-5=1
6-5=1
4-5=-1
5-4=1
6-4=2
5-6=-1
5-6=-1
4-6=-2
5-5=0
5-5=0
5-5=0
6-6=0
16
图3 一子棋的极大极小搜索
MAX在初始节点时应该怎么走…
b.MIN走步必然选择对自己最有 利的一步,如节点的估计值是-2
3 A
a1
a2
a3
a.MAX走步必然选择对自己最有利的 一步,如A节点的估计值是3 b.MIN走步必然选择对自 己最有利的一步,如D节 点的估计值是2 获得根节点取值的那一 d3分枝,即为所选择的最 佳走步
MIN
3 B
b2 b3 c1
2C
c2 c3 d1
2D
d2
b1
3
12 8
2
4
6
14
5
2
定义一个静态估计函数f,以便对棋局的叶子节点作出优劣估值 1.首先按照一定的搜索深度生成出给定深度d以内的所有状态, 计算所有叶节点的评价函数值。 极大极小搜索方法是一种在有限搜索深度范围进行求解的方法.
一字棋游戏极小极大树
MAX在第二步应该怎么走…
一字棋游戏极小极大树
α -β 剪枝
在极小极大搜索方法中,由于要先生成指定深度以内的所 有节点,其节点数将随着搜索深度的增加呈指数增长。这极 大地限制了极小极大搜索方法的使用。
α-β剪枝的基本思想:
边生成博弈树边计算评估各节点的倒推值,并且根据评估 出的倒推值范围,及时停止扩展那些已无必要再扩展的子节 点,即相当于剪去了博弈树上的一些分枝,从而节约了机器 开销,提高了搜索效率。
人工智能五子棋实验报告

题目:智能五子棋游戏一、实验目的理解和掌握博弈树的启发式搜索过程和α-β减枝技术,能够用某种程序语言开发一个五子棋博弈游戏。
二、实验要求(1)设计一个15行15列棋盘,要求自行给出估价函数,按极大极小搜索方法,并采用α-β减枝技术。
(2)采用人机对弈方式,对弈双方设置不用颜色的棋子,一方走完后,等待对方走步,对弈过程的每个棋局都在屏幕上显示出来。
当某一方在横、竖或斜方向上先有5个棋子连成一线时,该方为赢。
(3)提交一篇实验论文,以及完整的软件(包括源程序和可可执行程序)和相关文档。
三、实验原理①估价函数的设计:下子后,求在该点的所有8个方向上4格之内的所有的没有阻隔的白子的和加上没有阻隔的黑子的数目之和,和为估价函数的值。
直观来说就是,如果在该点下子后连成同颜色的棋子越多,该点的估价值越大,同时阻挡另一种颜色的棋子越多,估价值也越大。
②判断是否有一方胜出:设计is_win函数,在每一次下子后检查是否是终局(一方胜出或者棋盘下满和局)。
对于棋盘上每一个已经下了棋子的点,检查其4个方向上是否有连续5颗同颜色的棋子,若有,则有一方胜出。
③寻找候选点,用于建立博弈树:对于棋盘上每一个还没有下子的点,测试其附近8个点是否已经下了棋子,若有,把该点加入候选点。
④搜寻最佳着点:根据候选点建立3层的博弈树,再利用估价函数对节点进行比较,得出最佳着点。
四、代码人主要代码public void refreshMax(int n){switch(n){case 1:{ //更新预测棋盘1最大值及其坐标maxValue1=0;number1=0;for(int i=0;i<size;i++){for(int j=0;j<size;j++){if(preBoard1[i][j]>maxValue1){maxX1.clear();maxY1.clear();maxX1.add(i);maxY1.add(j);number1=1;}else if(preBoard1[i][j]==maxValue1){maxX1.add(i);maxY1.add(j);number1++;}}}break;}case 2:{ //更新预测棋盘2最大值及其坐标maxValue2=0;number2=0;for(int i=0;i<size;i++){for(int j=0;j<size;j++){if(preBoard2[i][j]>maxValue2){maxX2.clear();maxY2.clear();maxX2.add(i);maxY2.add(j);number2=1;}else if(preBoard2[i][j]==maxValue2){maxX2.add(i);maxY2.add(j);number2++;}}}break;}case 3:{ //更新预测棋盘3最大值及其坐标maxValue3=0;number3=0;for(int i=0;i<size;i++){for(int j=0;j<size;j++){if(preBoard3[i][j]>maxValue3){maxX3.clear();maxY3.clear();maxX3.add(i);maxY3.add(j);number3=1;}else if(preBoard3[i][j]==maxValue3){maxX3.add(i);maxY3.add(j);number3++;}}}break;}case 4:{ //更新预测棋盘4最大值及其坐标maxValue4=0;number4=0;for(int i=0;i<size;i++){for(int j=0;j<size;j++){if(preBoard4[i][j]>maxValue4){maxX4.clear();maxY4.clear();maxX4.add(i);maxY4.add(j);number4=1;}else if(preBoard4[i][j]==maxValue4){maxX4.add(i);maxY4.add(j);number4++;}}}break;}case 5:{ //更新预测棋盘5最大值及其坐标maxValue5=0;number5=0;for(int i=0;i<size;i++){for(int j=0;j<size;j++){if(preBoard5[i][j]>maxValue5){maxX5.clear();maxY5.clear();maxX5.add(i);maxY5.add(j);number5=1;}else if(preBoard5[i][j]==maxValue5){maxX5.add(i);maxY5.add(j);number5++;}}}break;}case 6:{ //更新预测棋盘6最大值及其坐标maxValue6=0;number6=0;for(int i=0;i<size;i++){for(int j=0;j<size;j++){if(preBoard6[i][j]>maxValue6){maxX6.clear();maxY6.clear();maxX6.add(i);maxY6.add(j);number6=1;}else if(preBoard6[i][j]==maxValue6){maxX6.add(i);maxY6.add(j);number6++;}}}break;}case 7:{ //更新预测棋盘7最大值及其坐标maxValue7=0;number7=0;for(int i=0;i<size;i++){for(int j=0;j<size;j++){if(preBoard7[i][j]>maxValue7){maxX7.clear();maxY7.clear();maxX7.add(i);maxY7.add(j);number7=1;}else if(preBoard7[i][j]==maxValue7){maxX7.add(i);maxY7.add(j);number7++;}}}break;}}}AI主要代码public void refreshMax(int n){switch(n){maxValue1=0;number1=0;for(int i=0;i<size;i++){for(int j=0;j<size;j++){if(preBoard1[i][j]>maxValue1){maxValue1=preBoard1[i][j];maxX1.clear();maxY1.clear();maxX1.add(i);maxY1.add(j);number1=1;}else if(preBoard1[i][j]==maxValue1){maxX1.add(i);maxY1.add(j);number1++;}}}break;}maxValue2=0;number2=0;for(int i=0;i<size;i++){for(int j=0;j<size;j++){if(preBoard2[i][j]>maxValue2){maxValue2=preBoard2[i][j];maxX2.clear();maxY2.clear();maxX2.add(i);maxY2.add(j);number2=1;}else if(preBoard2[i][j]==maxValue2){maxX2.add(i);maxY2.add(j);number2++;}}}break;}maxValue3=0;number3=0;for(int i=0;i<size;i++){for(int j=0;j<size;j++){if(preBoard3[i][j]>maxValue3){maxValue3=preBoard3[i][j];maxX3.clear();maxY3.clear();maxX3.add(i);maxY3.add(j);number3=1;}else if(preBoard3[i][j]==maxValue3){maxX3.add(i);maxY3.add(j);number3++;}}}break;}maxValue4=0;number4=0;for(int i=0;i<size;i++){for(int j=0;j<size;j++){if(preBoard4[i][j]>maxValue4){maxValue4=preBoard4[i][j];maxX4.clear();maxY4.clear();maxX4.add(i);maxY4.add(j);number4=1;}else if(preBoard4[i][j]==maxValue4){maxX4.add(i);maxY4.add(j);number4++;}}}break;}maxValue5=0;number5=0;for(int i=0;i<size;i++){for(int j=0;j<size;j++){if(preBoard5[i][j]>maxValue5){maxValue5=preBoard5[i][j];maxX5.clear();maxY5.clear();maxX5.add(i);maxY5.add(j);number5=1;}else if(preBoard5[i][j]==maxValue5){maxX5.add(i);maxY5.add(j);number5++;}}}break;}maxValue6=0;number6=0;for(int i=0;i<size;i++){for(int j=0;j<size;j++){if(preBoard6[i][j]>maxValue6){maxValue6=preBoard6[i][j];maxX6.clear();maxY6.clear();maxX6.add(i);maxY6.add(j);number6=1;}else if(preBoard6[i][j]==maxValue6){maxX6.add(i);maxY6.add(j);number6++;}}}break;}maxValue7=0;number7=0;for(int i=0;i<size;i++){for(int j=0;j<size;j++){if(preBoard7[i][j]>maxValue7){maxValue7=preBoard7[i][j];maxX7.clear();maxY7.clear();maxX7.add(i);maxY7.add(j);number7=1;}else if(preBoard7[i][j]==maxValue7){maxX7.add(i);maxY7.add(j);number7++;}}}break;}}}五、感想通过这个试验,我对估价函数,极大极小搜索方法,α-β减枝技术有了更全面的认识,对它们的运用也更加熟练。
博弈树实现3字棋程序设计报告

目录摘要 (2)第一部分设计总概 (2)一.设计目的 (2)二.设计要求及内容 (3)三.设计方法 (3)四.系统分析与设计 (3)一。
概要设计 (3)二. 详细设计 (3)第二部分数据结构设计 (4)一:主系统的函数 (4)二:头文件 (4)第三部分功能实现与程序调试 (4)一:程序实现的功能流程图 (5)二:程序实现源代码 (5)1. 头文件 (5)2.cpp文件代码 (8)三.程序实现截图 (9)1.界面 (9)2。
进入游戏开始下棋 (9)3.判断棋局胜负: (11)4:结束游戏: (11)第四部分完成设计 (12)一、实验总结 (12)摘要用所学的语言,设计简单的一字棋游戏。
关键字:博弈,启发式搜索第一部分设计总概一.设计目的理解和掌握博弈树的启发式搜索过程,能够用选定的编程语言实现简单的博弈游戏.二.设计要求及内容设计一个不少于3行3列的棋盘,自己给出估价函数,采用极大极小搜索方法。
采用人机对弈的方式,一方走步够等待对方,对弈过程的棋局变化在屏幕上显示.三.设计方法采用c语言编写程序实现四.系统分析与设计一. 概要设计A:进入主界面主界面包括导语及游戏操作步骤及其规则B:进入游戏,开始下棋C:判断输赢,结束游戏D:判断是否重新开始游戏是则返回B步骤否则结束游戏二。
详细设计1。
进入vs2010,选择win32项目,新建程序2.界面设计利用所学的c语言知识,设计一个简单的棋盘游戏界面3.函数设计利用所学的算法,编写棋盘分析函数第二部分数据结构设计一:主系统的函数窗口创建函数,消息响应函数皆放在主函数cpp里面二:头文件存放具体的操作步骤及其函数第三部分功能实现与程序调试一:程序实现的功能流程图二:程序实现源代码1.头文件A:定义类:#include <iostream〉#include <string> using namespace std; class CGobang //棋子类{private:char chSort;//棋子的类别int nWin;//赢棋的次数int nLose; //输棋的次数static int nDraw;//平局次数static char achBoard[3][3]; //棋盘static int nSize;//棋盘的尺寸nSize XnSizepublic:CGobang(char chsort)//构造函数,决定一方棋子的类别{chSort=chsort;nWin=nLose=nDraw=0;}void PlayTurn(void); //走1步棋int Judge(); //判断是否连成一线,是则返回1,否则返回0void Win(void); //赢棋void Lose(void);//输棋static void Draw(void); //平局void PrintInfo(void); //输出总体情况static void PrintBoard(void); //输出棋盘static int GetFull(void);//判断棋盘是否已布满棋子static void InitialBoard(void);//初始化棋盘};B:操作函数:#include ”lei.h"#include<math。
博弈树的启发式搜索

博弈树的启发式搜索问题A方、B方必须是完备博弈,它有三个条件:1、A,B双方轮流博弈。
博弈的结果只有三种情况:A胜,B败;A败,B胜;A,B平手。
2、任一方都了解当前的棋局和历史的棋局。
3、任一方都分析当前的棋局,并能作出有利于自己,而不利于对方的策略。
我们描述博弈过程采用与/或树1、博弈的初始棋局作为初始节点2、‘或’节点与‘与’节点逐层交替出现。
自己一方扩展节点之间是‘或’,对方扩展节点之间是‘与’。
双方轮流扩展。
3、所有能使自己获胜的终局都是本原问题,相应的节点是可解节点。
本问题其实是一个构造博弈树的问题。
对给定的棋局,该棋局中A,B方的棋子数相等,并且轮到A方下。
这样构成一个初始棋局,称一个状态。
当A或B下一个棋子后,又形成一个新的状态。
任何一方都希望自己取得胜利,因此当某一方有多个方案可供选择时,他总是跳最有利于自己而最不利对方的方案。
此时我们站在A的立场上看,可供A选择的方案之间是‘或’的关系,可供B的方案之间是‘与’的关系。
因为主动权在A上,A必须考虑任何一个可能被B选中的方案。
极大极小分析方法的特点:1、它是为其中一方寻找一个最优的行动方案的方法2、为了当前最优的方案,需要对各个方案能产生的后果进行比较,具体地说就是考虑每个方案实施后,对方可能采取的行动,并计算可能的得分4、为了计算得分,需要根据问题的特性定义一个估价函数,用来计算当前博弈树端节点的得分,该得分也称静态估值5、当端节点估值后,再推算父节点的得分,推算方法是对于‘或’节点,选择子节点中最大的得分作为自己的得分,对于‘与’节点,选择子节点中最小的得分作为自己的得分,父节点得得分也称倒退值6、若某一个行动方案能获得最大得倒退值,则它就是当前最好得方案在本问题中,假设棋盘为4*4的矩阵,A方的棋子为1,B方的棋子为-1,空格为0。
我们定义估价函数为:在某一棋局状态,A方棋子可能占满的整行,整列,整斜线总和与B 方棋子可能占满的整行,整列,整斜线总和的差。
第3章(搜索推理技术1-图盲目搜索)

①、起 始节点 ( 即根
节点)的深度为0。
②、任何其它节点的
深度等于其父辈
节点深度加上1。
深度优先搜索的基本
思路:
先扩展最深的节点 。
当出现没有后继节点
时,换到旁边的次深
节点
后生成的节点画在左边
含有深度界限的深度优先搜索算法:
① 把起始节点 S 放到未扩展节点的 OPEN 表中。 如果此节点为一目标节点,则得到解 ② 如果 OPEN 为一空表,则无解、失败退出
状态:长度为9的一维数组
(q1 , q2 , … , q9 )
其中,qi 取 0 , 1 , … , 8 个数,0 表示空格,且取值
互不相同
如果记空格的位置为P,这时空格的移动规则是: 1 4 7 2 5 8 3 6 9 数字表示位置 1 2 3 4 5 6 7 8 9 P-3
P-1
P
P+1
P+3
起始节点的父节点标志和操作符:
不作记录或记录为负
搜索过程(按照程序运行方式)
① 起始节点放到OPEN表
2 8 3 1 0 4
2 8 3 1 4 7 6 5 7 6 5
② OPEN不为空,继续
③ 将第一个节点 n 从 OPEN 表中移出,并放到 CLOSED表中 OPEN表
CLOSED表 1 0 0 2 8
13
14
1
4
2
8
8
3
3
0
1
2
4
1
5
4
7
7
0
6
6
5
1 8
7
2
3 4
14 15 15
16 16
3 2 4
一字棋实验报告

一.实验目的:1.理解和掌握博弈树的启发式搜索过程2.学习极大极小搜索α–β剪枝3.能够用选定的编程语言设计简单的博弈游戏二.实验环境及工具1.硬件环境:网络环境中的微型计算机2.软件环境:Windows操作系统,VC++语言三.实验原理1. 游戏规则“一字棋”游戏(又叫“三子棋”或“井字棋”),是一款十分经典的益智小游戏。
“井字棋”的棋盘很简单,是一个 3×3 的格子,很像中国文字中的“井”字,所以得名“井字棋”。
“井字棋”游戏的规则与“五子棋”十分类似,“五子棋”的规则是一方首先五子连成一线就胜利;“井字棋”是一方首先三子连成一线就胜利。
2.井字棋(英文名 Tic-Tac-Toe)井字棋的出现年代估计已不可考,西方人认为这是由古罗马人发明的;但我们中国人认为,既然咱们都发明了围棋、五子棋,那发明个把井字棋自然是不在话下。
3.极大极小分析法设有九个空格,由 MAX,MIN 二人对弈,轮到谁走棋谁就往空格上放一只自己的棋子,谁先使自己的棋子构成“三子成一线”(同一行或列或对角线全是某人的棋子),谁就取得了胜利。
用圆圈表示 MAX,用叉号代表 MIN。
比如下图中就是 MAX取胜的棋局。
a)估价函数设棋局为 P,估价函数为 e(P)。
(1) 若 P 对任何一方来说都不是获胜的位置,则 e(P)=e(那些仍为MAX 空着的完全的行、列或对角线的总数)-e(那些仍为 MIN 空着的完全的行、列或对角线的总数)(2) 若 P 是 MAX 必胜的棋局,则 e(P)=+∞(实际上赋了 60)。
(3) 若 P 是 B 必胜的棋局,则 e(P)=-∞(实际上赋了-20)。
比如 P 如下图示,则 e(P)=5-4=14.α–β剪枝算法上述的极小极大分析法,实际是先生成一棵博弈树,然后再计算其倒推值,至使极小极大分析法效率较低。
于是在极小极大分析法的基础上提出了α-β剪枝技术。
α-β剪枝技术的基本思想或算法是,边生成博弈树边计算评估各节点的倒推值,并且根据评估出的倒推值范围,及时停止扩展那些已无必要再扩展的子节点,即相当于剪去了博弈树上的一些分枝,从而节约了机器开销,提高了搜索效率。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
博弈树的启发式搜索问题
A方、B方必须是完备博弈,它有三个条件:
1、A,B双方轮流博弈。
博弈的结果只有三种情况:A胜,B败;A败,B胜;A,B平手。
2、任一方都了解当前的棋局和历史的棋局。
3、任一方都分析当前的棋局,并能作出有利于自己,而不利于对方的策略。
我们描述博弈过程采用与/或树
1、博弈的初始棋局作为初始节点
2、‘或’节点与‘与’节点逐层交替出现。
自己一方扩展节点之间是‘或’,对方扩展节
点之间是‘与’。
双方轮流扩展。
3、所有能使自己获胜的终局都是本原问题,相应的节点是可解节点。
本问题其实是一个构造博弈树的问题。
对给定的棋局,该棋局中A,B方的棋子数相等,并且轮到A方下。
这样构成一个初始棋局,称一个状态。
当A或B下一个棋子后,又形成一个新的状态。
任何一方都希望自己取得胜利,因此当某一方有多个方案可供选择时,他总是跳最有利于自己而最不利对方的方案。
此时我们站在A的立场上看,可供A选择的方案之间是‘或’的关系,可供B的方案之间是‘与’的关系。
因为主动权在A上,A必须考虑任何一个可能被B选中的方案。
极大极小分析方法的特点:
1、它是为其中一方寻找一个最优的行动方案的方法
2、为了当前最优的方案,需要对各个方案能产生的后果进行比较,具体地说就是考虑每个方案实施后,对方可能采取的行动,并计算可能的得分
4、为了计算得分,需要根据问题的特性定义一个估价函数,用来计算当前博弈树端节点的
得分,该得分也称静态估值
5、当端节点估值后,再推算父节点的得分,推算方法是对于‘或’节点,选择子节点中最
大的得分作为自己的得分,对于‘与’节点,选择子节点中最小的得分作为自己的得分,父节点得得分也称倒退值
6、若某一个行动方案能获得最大得倒退值,则它就是当前最好得方案
在本问题中,假设棋盘为4*4的矩阵,A方的棋子为1,B方的棋子为-1,空格为0。
我们定义估价函数为:在某一棋局状态,A方棋子可能占满的整行,整列,整斜线总和与B 方棋子可能占满的整行,整列,整斜线总和的差。
这儿的可能是指棋局上留出的空格让A 方或B方全摆放它的棋子。
显然如果A方的大。
它的下棋选择的策略范围就大。
对某个棋局用极大极小分析后,得出A下一步的最佳策略,同时也给出B的最不利A 的策略,这样一直循环,直到棋局上无空格,如果棋局上A已经胜出了。
那么就意味着B 如何采取对A最不利的策略,A也能胜出,表明A处于必胜状态。
程序说明:
编写语言:Matlab6.5
主函数:Chess.m
ChkVictory.m函数:计算某个棋局状态中A方是否已经胜出
算法:对矩阵的列,行,斜线求和。
若和为4,则A已经胜出,否则返回0
ChkLines.m函数:计算中某个棋局状态中A方或B方全占满的行,列,斜线数总和
算法:对矩阵的列,行,斜线求和。
把矩阵中和为4的行数,列数,斜线数总和返回
CalFunc.m函数:计算估价函数值
算法:对某个棋局状态,首先把该棋局状态的空格塞满A方的棋子,算出现在A方棋子占满整行,整列,整斜线的总数。
然后在原来的棋局状态的空格塞满B方的棋子,算出B方棋子占满整行,整列,整斜线的总数。
然后求两者差。
该启发函数将引导A方如何下棋子,做到作出有利于自己,而不利于对方的策略。
Excute.m函数:执行棋局分析
Chess.m函数:读input.txt文件,运行棋局分析函数,写output.txt文件。