人工智能αβ剪枝实现的一字棋实验报告
- 格式:doc
- 大小:248.00 KB
- 文档页数:14
人工智能上机报告项目:简易五子棋游戏班级:学号:姓名:指导老师:2013年6月目录一:实验项目 (2)二:程序结构及相关内容介绍 (2)三:程序运行界面及使用说明 (3)四:主要代码 (8)Chessboard.cs (8)Computer.cs (12)Rule.cs (16)Stone.cs (27)一:实验项目综合实验1. 实验目的理解和掌握博弈树的启发式搜索过程和α-β剪枝技术,能够用某种程序语言开发一个五子棋博弈游戏。
2. 实验环境在微型计算机上,任选一种编程语言。
3. 实验要求(1) 设计一个15行15列棋盘,要求自行给出估价函数,按极大极小搜索方法,并采用α-β剪枝技术。
(2) 采用人机对弈方式,对弈双方设置不同颜色的棋子,一方走完一步后,等待对方走步,对弈过程的每个棋局都在屏幕上显示出来。
当某一方在横、竖或斜方向上先有5个棋子连成一线时,该方为赢。
(3) 提交1篇实验报告,以及完整的软件系统和相关文档,包括源程序和可执行程序。
二:程序结构及相关内容介绍程序涉及两个窗体:一个是游戏进行的主界面Form 4,一个用于对游戏的说明: Form 4_1 均存在Forms 文件夹中:在文件夹Lab 4 中添加了用于功能实现的四个类,分别是Chessboard.cs Computer.cs Rule.cs Stone.cs 在窗体控件的响应函数中调用这些类和函数,实现程序运行。
三:程序运行界面及使用说明程序主窗体如下:首先,在主窗体的Menustrip 中点击“Lab4 五子棋” 则呈现出游戏界面,如下所示:可以看出游戏共由:棋盘,棋子坐标,选择棋子,棋子位置记录及游戏设置、说明五部分组成。
在窗口的左上角,是游戏说明与设置部分:点击“游戏”可以设置:决定是由玩家走第一步棋还是由电脑走第一步,在所选项前打钩即可,程序默认“玩家先”,如果选择了“电脑先” 则电脑随即在棋盘上安排第一个棋子。
点击”关闭”会退出游戏,但是不结束整个程序的运行。
实验二:利用α-β搜索过程的博弈树搜索算法编写一字棋游戏(3学时)一、实验目的与要求(1)了解极大极小算法的原理和使用方法,并学会用α-β剪枝来提高算法的效率。
(2)使用C语言平台,编写一个智能井字棋游戏。
(3)结合极大极小算法的使用方法和α-β剪枝,让机器与人对弈时不但有智能的特征,而且计算的效率也比较高。
二、实验原理一字棋游戏是一个流传已久的传统游戏。
游戏由两个人轮流来下,分别用“X”和“O”来代替自身的棋子。
棋盘分9个格,双方可以在轮到自己下的时候,可以用棋子占领其中一个空的格子。
如果双方中有一方的棋子可以连成一条直线,则这一方判胜,对方判负。
当所有的格子都被占领,但双方都无法使棋子连成一条直线的话,则判和棋。
这是一个智能型的一字棋游戏,机器可以模拟人与用户对弈。
当轮到机器来下的时候,机器会根据当前棋局的形势,利用极大极小算法算出一个评价值,判断如何下才对自身最有利,同时也是对方来说对不利的,然后下在评价值最高的地方。
另外利用α-β剪枝,使机器在搜索评价值的时候不用扩展不必要的结点,从而提高机器计算的效率。
在用户界面方法,用一个3×3的井字格来显示用户与机器下的结果。
当要求用户输入数据的时候会有提示信息。
用户在下的过程中可以中途按下“0”退出。
当用户与计算机分出了胜负后,机器会显示出比赛的结果,并按任意键退出。
如果用户在下棋的过程中,输入的是非法字符,机器不会做出反应。
三、实验步骤和过程1.α-β搜索过程在极小极大搜索方法中,由于要先生成指定深度以内的所有节点,其节点数将随着搜索深度的增加承指数增长。
这极大地限制了极小极大搜索方法的使用。
能否在搜索深度不变的情况下,利用已有的搜索信息减少生成的节点数呢?设某博弈问题如下图所示,应用极小极大方法进行搜索MINIMAX过程是把搜索树的生成和格局估值这两个过程分开来进行,即先生成全部搜索树,然后再进行端节点静态估值和倒推值计算,这显然会导致低效率。
《人工智能》课外实践报告项目名称:剪枝法五子棋所在班级: 2013级软件工程一班小组成员:李晓宁、白明辉、刘小晶、袁成飞、程小兰、李喜林指导教师:薛笑荣起止时间: 2016-5-10——2016-6-18项目基本信息一、系统分析1.1背景1.1.1 设计背景智力小游戏作为人们日常休闲娱乐的工具已经深入人们的生活,五子棋更成为了智力游戏的经典,它是基于AI的αβ剪枝法和极小极大值算法实现的人工智能游戏,让人们能和计算机进行对弈。
能使人们在与电脑进行对弈的过程中学习五子棋,陶冶情操。
并且推进人们对AI的关注和兴趣。
1.1.2可行性分析通过研究,本游戏的可行性有以下三方面作保障(1)技术可行性本游戏采用Windows xp等等系统作为操作平台,使用人工智能进行算法设计,利用剪枝法进行编写,大大减少了内存容量,而且不用使用数据库,便可操作,方便可行,因此在技术上是可行的。
(2)经济可行性开发软件:SublimText(3)操作可行性该游戏运行所需配置低、用户操作界面友好,具有较强的操作可行性。
1.2数据需求五子棋需要设计如下的数据字段和数据表:1.2.1 估值函数:估值函数通常是为了评价棋型的状态,根据实现定义的一个棋局估值表,对双方的棋局形态进行计算,根据得到的估值来判断应该采用的走法。
棋局估值表是根据当前的棋局形势,定义一个分值来反映其优势程度,来对整个棋局形势进行评价。
本程序采用的估值如下:状态眠二假活三眠三活二冲四假活三活三活四连五分值 2 4 5 8 12 15 40 90 200一般来说,我们采用的是15×15的棋盘,棋盘的每一条线称为一路,包括行、列和斜线,4个方向,其中行列有30路,两条对角线共有58路,整个棋盘的路数为88路。
考虑到五子棋必须要五子相连才可以获胜,这样对于斜线,可以减少8路,即有效的棋盘路数为72路。
对于每一路来说,第i路的估分为E(i)=Ec(i)-Ep(i),其中Ec(i)为计算机的i路估分,Ep(i)为玩家的i路估分。
题目:智能五子棋游戏一、实验目的理解和掌握博弈树的启发式搜索过程和α-β减枝技术,能够用某种程序语言开发一个五子棋博弈游戏。
二、实验要求(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;}}}五、感想通过这个试验,我对估价函数,极大极小搜索方法,α-β减枝技术有了更全面的认识,对它们的运用也更加熟练。
标准文档《人工智能》课外实践报告项目名称:剪枝法五子棋所在班级: 2013级软件工程一班小组成员:李晓宁、白明辉、刘小晶、袁成飞、程小兰、李喜林指导教师:薛笑荣起止时间: 2016-5-10——2016-6-18项目基本信息项目名称五子棋项目简介智力小游戏作为人们日常休闲娱乐的工具已经深入人们的生活,五子棋更成为了智力游戏的经典,它是基于AI的αβ剪枝法和极小极大值算法实现的人工智能游戏,让人们能和计算机进行对弈。
这个项目我们实现了当人点击“开始”按钮时,开始下棋,当人的棋子落时,计算机会根据算法进行最佳路径计算,然后落子下棋。
任何一方赢了都会弹出哪方赢了。
然后单击重新开始。
任务分工李晓宁 130904021 白明辉 130904001:负责界面实现和估值函数设计文档整理刘小晶 130904032 袁成飞 130904051:负责极小极大值算法的设计与实现李喜林 130904019 程小兰 130904004:负责αβ剪枝法的设计与实现一、系统分析1.1背景1.1.1 设计背景智力小游戏作为人们日常休闲娱乐的工具已经深入人们的生活,五子棋更成为了智力游戏的经典,它是基于AI的αβ剪枝法和极小极大值算法实现的人工智能游戏,让人们能和计算机进行对弈。
能使人们在与电脑进行对弈的过程中学习五子棋,陶冶情操。
并且推进人们对AI的关注和兴趣。
1.1.2可行性分析通过研究,本游戏的可行性有以下三方面作保障(1)技术可行性本游戏采用Windows xp等等系统作为操作平台,使用人工智能进行算法设计,利用剪枝法进行编写,大大减少了内存容量,而且不用使用数据库,便可操作,方便可行,因此在技术上是可行的。
(2)经济可行性开发软件:SublimText(3)操作可行性该游戏运行所需配置低、用户操作界面友好,具有较强的操作可行性。
1.2数据需求五子棋需要设计如下的数据字段和数据表:1.2.1 估值函数:估值函数通常是为了评价棋型的状态,根据实现定义的一个棋局估值表,对双方的棋局形态进行计算,根据得到的估值来判断应该采用的走法。
alphabeta剪枝例题Alpha-Beta剪枝算法是一种在搜索博弈树的过程中,通过维护两个值(α和β)来减少搜索的节点数的方法。
以下是一个简单的Alpha-Beta剪枝算法的例子:假设我们正在玩一个简单的井字棋游戏,现在轮到玩家X下棋。
使用Alpha-Beta剪枝算法可以帮助玩家X决定在哪个位置下棋。
Alpha-Beta剪枝算法的步骤如下:1. 初始化:设置当前玩家为玩家X,设置α和β的值,通常α设为负无穷,β设为正无穷。
2. 开始递归搜索:从当前节点开始,递归地搜索子节点。
对于每个子节点,根据当前玩家是最大化还是最小化来更新α和β的值。
3. 判断是否需要剪枝:如果β小于等于α,表示对手已经找到了一个更好的选择,我们可以剪掉当前节点的搜索分支,不再继续搜索。
4. 返回最佳走法:如果当前节点是叶子节点,则返回该节点的值;否则,返回最佳子节点的值。
以下是这个算法的伪代码表示:```pythonfunction alphabeta(node, depth, α, β, maximizingPlayer):if depth = 0 or node is a terminal node:return the heuristic value of nodeif maximizingPlayer:value = -∞for each child of node:value = max(value, alphabeta(child, depth - 1, α, β, FALSE))α = max(α, value)if β ≤ α:breakreturn valueelse:value = +∞for each child of node:value = min(value, alphabeta(child, depth - 1, α, β, TRUE))β = min(β, value)if β ≤ α:breakreturn value```在上述代码中,`node`表示当前节点,`depth`表示当前节点的深度,`α`和`β`分别表示当前玩家的最好选择和对手的最好选择,`maximizingPlayer`表示当前玩家是最大化还是最小化。
一字棋实验实验目的通过实现人机博弈的一字棋程序,掌握人工智能的搜索原理。
理解当递归深度比较深的时候,α-β剪枝算法对计算机搜索效率的影响。
通过调整评价走步函数的参数以及算法,使得计算机的走步更加智能。
实验原理一字棋的搜索算法采用极大极小值搜索算法,算法如下:(1)将初始节点S放入OPEN表中,开始时搜索树T由初始节点构成。
(2)若OPEN表为空,则转(8)。
(3)将OPEN表中第一个节点n移出放入CLOSED表中。
(4)若n可直接判定为输、赢、或者平局,则令对应的评价函数f(n)= ∞,- ∞,和0,并转(2);否则扩展n,产生n的子节点集{n1},将{n1}放入搜索树T中。
此时,若搜索深度d(n1)小于预先设置的深度k,则将{n1}放入OPEN表的末端,转(2);否则n1达到深度k,计算f(n1),转(2)。
(5)若CLOSED表为空,则转(8);否则将CLOSED表中的第一个节点设为np。
(6)若np属于max层,且对于它的属于min层的子节点{nc1}有值,则f(np)=max{f(nc1)},并将np放入CLOSED表中;若np属于min层,且对于它的属于max层的子节点nc1的f (nc1)有值,则f(np)=min{f(nc1)},将np放入CLOSED表中。
(7)转(5)。
(8)若f(s)不空,则s有值,或者结束或者标记走步。
实际上搜索过程分为两个阶段进行:第一阶段为(2)——(4),用宽度优先法生成规定深度k的全部博弈树,然后对其所有叶子节点计算其f(p);第二阶段为(6)——(8),是由底向上利用极大极小算法逐级求端节点倒推估价值,直至求出初始节点的f(s)为止,再由f(s)选得相对较好的着法,过程结束。
等对手相应走步后,再以当前的格局作为初始节点,重复调用此过程,形成博弈树的极大极小搜索。
估价函数的定义(1)若p对任何一方来说都不是获胜的位置,则f(p)=(那些仍然为max方空着的完全的行、列、对角线的总数)- (那些仍然为min方空着的完全的行、列、对角线的总数);(2)若p为max方获胜的位置,则f(p)=∞;(在实际应用中可以定义一个相对比较大的数字)(3)若p为min方获胜的位置,则f(p)= - ∞;所谓完全的行、列、或对角线是指可能被三个同样的棋子所占满的行、列、或对角线。
人工智能期中作业一字棋编程姓名:班级:学号:一、程序设计思想:1.通过判断一字棋的棋局是否与之前搜索过的棋局重复来减小搜索的复杂度。
(通过对称属性来判断是否重复)2.主程序采用递归的思想来解决此类复杂问题。
主程序的功能为按照αβ剪枝策略算出当前棋局的分数,依次递归。
int jianzhi(enzo a,int tier)为整个程序的关键函数。
其中enzo 是结构体类型(自定义),int tier 为层数。
递归如下:v[tier]=max(jianzhi(a,tier+1),v[tier]);(其中a每次传递之前都会被更新)。
3.如何判断是否是αβ剪枝是关键。
先用int v[4]数组来存储第0 、1、2、3层的分数。
初始值分别为-100,100,-100,100。
共有3种α剪枝情况和1中β剪枝情况。
详情见Int aorb();子函数。
二、程序源代码:#include <iostream>#include<vector>using namespace std;int jzs=0;int ajz=0,bjz=0;int v[4]= {-100,100,-100,100};class enzo{public:int a[3][3];//棋局enzo()//初始构造函数{for(int i=0; i<3; i++)for(int j=0; j<3; j++)a[i][j]=2;}void pr()//输出棋局{for(int i=0; i<3; i++){for(int j=0; j<3; j++){if(a[i][j]==1) cout<<'X'<<" ";if(a[i][j]==0) cout<<'O'<<" ";if(a[i][j]==2) cout<<". ";}cout<<endl;}}};//计算数组的静态估值int value_1(enzo a,int b){int v=0;for(int i=0; i<3; i++){for(int j=0; j<3; j++)if(a.a[i][j]==2) a.a[i][j]=b;}// a.pr();for(int i=0; i<3; i++)if(a.a[i][0]==b&&a.a[i][1]==b&&a.a[i][2]==b) v++;for(int i=0; i<3; i++)if(a.a[0][i]==b&&a.a[1][i]==b&&a.a[2][i]==b) v++;if(a.a[0][0]==b&&a.a[1][1]==b&&a.a[2][2]==b) v++;if(a.a[0][2]==b&&a.a[1][1]==b&&a.a[2][0]==b) v++;return v;}int value(enzo a){return(value_1(a,1)-value_1(a,0));}bool sym(enzo a,enzo b)//判断是否上下左右斜对称(没有考虑旋转的情况){if(a.a[0][1]==b.a[0][1]&&a.a[1][1]==b.a[1][1]&&a.a[2][1]==b.a[2][1]) //左右对称if(a.a[0][0]==b.a[0][2]&&a.a[1][0]==b.a[1][2]&&a.a[2][0]==b.a[2][2])if(a.a[0][2]==b.a[0][0]&&a.a[1][2]==b.a[1][0]&&a.a[2][2]==b.a[2][0]) return true;if(a.a[1][0]==b.a[1][0]&&a.a[1][1]==b.a[1][1]&&a.a[1][2]==b.a[1][2]) //上下对称if(a.a[0][0]==b.a[2][0]&&a.a[0][1]==b.a[2][1]&&a.a[0][2]==b.a[2][2])if(a.a[2][0]==b.a[0][0]&&a.a[2][1]==b.a[0][1]&&a.a[2][2]==b.a[0][2]) return true;if(a.a[0][0]==b.a[0][0]&&a.a[1][1]==b.a[1][1]&&a.a[2][2]==b.a[2][2]) //两个斜对称if(a.a[0][1]==b.a[1][0]&&a.a[0][2]==b.a[2][0]&&a.a[1][2]==b.a[2][1])if(a.a[1][0]==b.a[0][1]&&a.a[2][0]==b.a[0][2]&&a.a[2][1]==b.a[1][2]) return true;if(a.a[0][2]==b.a[0][2]&&a.a[1][1]==b.a[1][1]&&a.a[2][0]==b.a[2][0])if(a.a[0][0]==b.a[2][2]&&a.a[0][1]==b.a[1][2]&&a.a[1][0]==b.a[2][1])if(a.a[2][2]==b.a[0][0]&&a.a[1][2]==b.a[0][1]&&a.a[2][1]==b.a[1][0]) return true;return false;}bool nsym(enzo a,enzo b){if(sym(a,b)) return false;else return true;}int aorb()//a - 0 b -1{if(v[0]>=v[1]&&v[0]!=-100&&v[1]!=100){jzs++;cout<<jzs<<": "<<"发生a剪枝"<<endl;ajz++;return 1;}else if(v[0]>=v[3]&&v[0]!=-100&&v[3]!=100){jzs++;cout<<jzs<<": "<<"发生a剪枝"<<endl;ajz++;return 1;}else if(v[2]>=v[3]&&v[2]!=-100&&v[3]!=100){jzs++;cout<<jzs<<": "<<"发生a剪枝"<<endl;ajz++;return 1;}else if(v[1]<=v[2]&&v[1]!=100&&v[2]!=-100){jzs++;cout<<jzs<<": "<<"发生b剪枝"<<endl;bjz++;return 1;}else return 0;}int jianzhi(enzo a,int tier){//a.pr();if(tier==4) return value(a);if(tier%2)//极小层{vector<enzo> hi;for(int i=0; i<3; i++){for(int j=0; j<3; j++){if(a.a[i][j]==2){int u=0;int qq=0;a.a[i][j]=0;for(u=0; u<(int)hi.size(); u++){if(sym(hi[u],a)) break;}if((int)hi.size()==u){hi.push_back(a);v[tier]=min(jianzhi(a,tier+1),v[tier]); if(aorb()) qq=1;}a.a[i][j]=2;if(qq==1){a.pr();cout<<endl;v[tier]=100;return -100;}}}}int hj=v[tier];v[tier]=100;return hj;}Else//极大层{vector<enzo> hi;for(int i=0; i<3; i++){for(int j=0; j<3; j++){if(a.a[i][j]==2){int u=0;int qq=0;a.a[i][j]=1;for(u=0; u<(int)hi.size(); u++){if(sym(hi[u],a)) break;}if((int)hi.size()==u){hi.push_back(a);v[tier]=max(jianzhi(a,tier+1),v[tier]); if(aorb()) qq=1;}a.a[i][j]=2;if(qq==1){a.pr();v[tier]=-100;return 100;}}}}int hj=v[tier];v[tier]=-100;return hj;}}int main(){enzo a0;jianzhi(a0,0);cout<<"一共"<<ajz<<"次a剪枝"<<endl;cout<<"一共"<<bjz<<"次b剪枝"<<endl;}三、αβ剪枝搜索过程(其中’.’表示空)共发生了23次α剪枝,5次β剪枝。
个人自我介绍简单大方
很抱歉,但我无法为您提供____字的自我介绍。
以下是一个简洁而大方的自我介绍示例,供您参考:
大家好,我叫[姓名]。
很高兴有机会向大家介绍一下自己。
我出生并长大在[所在地],是一个勤奋、积极向上的人。
在学业方面,我于[毕业时间]从[学校名称]获得了[学位/专业]学位。
在大学期间,我通过自我努力和课外学习,取得了良好的学术成绩,并参与了一些学生组织和社团活动。
这些经历不仅培养了我的团队合作和领导能力,也加强了我的沟通和组织能力。
在工作方面,我有[工作年限]年的相关工作经验。
我曾在[公司/组织名称]担任[职位],负责[工作职责]。
在这期间,我不断努力提升自己的专业知识和技能,以适应快速发展的工作环境。
我善于分析问题并找出解决方案,能够有效地与团队合作并承担责任,这些都为我赢得了同事和上级的认可。
除了工作,我也积极参与志愿者活动,希望能为社区和弱势群体做一点贡献。
我相信,通过奉献和关心他人,我们可以建立一个更加和谐和温暖的社会。
在个人生活中,我喜欢阅读、旅行和运动。
阅读扩展了我的视野,旅行让我能够体验不同的文化和风景,而运动则让我保持健康和积极的精神状态。
此外,我也很喜欢与家人和朋友相处,分享彼此的喜怒哀乐。
总的来说,我是一个热情、乐观、有责任心的人。
我相信勤奋和坚持可以取得成功,而真诚和善良可以赢得他人的信任和支持。
我希望能够在您的团队中发挥我的才能,并与大家一同成长和进步。
这就是我简单的自我介绍,谢谢大家!。