东北大学。
计算机1103班。龙巽震。
人工智能期中作业。
1.实验题目。
编写一字棋游戏。
2.实验要求
(1)利用极大极小算法及α-β剪枝策略,用你所熟悉的计算机语言,编程解决上述一字棋问题。
(2) open表中棋局排列次序:从左上到右下排列,即:(1,1)(1,2)(1,3)(2,1)(2,2)……3,2)(3,3)
(3) 根据深度k=4的程序运行结果,说明:
3.1 是否发生剪枝,发生几次α剪枝,几次β剪枝。
3.2 列出所搜索到的棋局状态(可以采用类似上图方式给出,也可以按搜索顺序依次列出各状态)
3.实验过程。
1.在进行α-β剪枝时,应注意以下几个问题:
(1)比较都是在极小节点和极大节点间进行的,极大节点和极大节点的比较,或者极小节点和极小节点间的比较是无意义的。
(2)在比较时注意是与"先辈层"节点比较,不只是与父辈节点比较。当然,这里的"先辈层"节点,指的是那些已经有了值的节点。
(3)当只有一个节点的"固定"以后,其值才能够向其父节点传递。
(4)α-剪枝方法搜索得到的最佳走步与极小极大方法得到的结果是一致的,α-剪枝并没有因为提高效率,而降低得到最佳走步的可能性。
(5)在实际搜索时,并不是先生成指定深度的搜索图,再在搜索图上进行剪枝。如果这样,就失去了α-β剪枝方法的意义。在实际程序实现时,首先规定一个搜索深度,然后按照类似于深度优先搜索的方式,生成节点。
在节点的生成过程中,如果在某一个节点处发生了剪枝,则该节点其余未生成的节点就不再生成了。
2.利用α-β搜索过程的一字棋的实例(借鉴网上的图)
3.实验**:
基于α-β剪枝的一字棋源**如下:
#include
using namespace std;
int num=0
int p,q
int tmpqp[3][3];
int cur[3][3];
const int depth=3;
void init()
for(int i=0;i<3;i++)
for(int j=0;j<3;j++)
void printqp()
for(int i=0;i<3;i++)
void userinput()/
int pos,x,y;
l1: cout<<"请输入你要下得位置,比如说11,就是指第一行第一个 ";
cin>>pos;
x=pos/10,y=pos%10;
if(x>0&&x<4&&y>0&&y<4&&cur[x-1][y-1]==0)
elseint checkwin()
if(cur[i][0]==1&&cur[i][1]==1&&cur[i][2]==1)
if(cur[i][0]==1&&cur[i][1]==1&&cur[i][2]==1)
for(i=0;i<3;i++)
if(cur[0][i]==1&&cur[1][i]==1&&cur[2][i]==1)
if((cur[0][0]==1&&cur[1][1]==1&&cur[2][2]==1)||cur[2][0]==1&&cur[1][1]==1&&cur[0][2]==1))
if((cur[0][0]==1&&cur[1][1]==1&&cur[2][2]==1)||cur[2][0]==1&&cur[1][1]==1&&cur[0][2]==1))
return 0;
int value()
p=0;q=0;for(int i=0;i<3;i
for(int j=0;j<3;j++)else
for(i=0;i<3;i
for(i=0;i<3;i
p+=(tmpqp[0][0]+tmpqp[1][1]+tmpqp[2][2])/3;
p+=(tmpqp[2][0]+tmpqp[1][1]+tmpqp[0][2])/3;
for(i=0;i<3;i
elsetmpqp[i][j]=cur[i][j];}
for(i=0;i<3;i
for(i=0;i<3;i++)
q+=(tmpqp[0][0]+tmpqp[1][1]+tmpqp[2][2])/3;
q+=(tmpqp[2][0]+tmpqp[1][1]+tmpqp[0][2])/3;
return p+q
int cut(int &val,int dep,bool max)
maxif(dep==depth||dep+num==9)
return value();
int i,j,flag,temp
bool out=false
if(checkwin()=1
if(max)
for(i=0;i<3 &&out;i++)
elseif(flag<=val)
out=true;}
elsecur[i][j]=1;
if(checkwin()=1)
temp=10000; }
elseif(temp>flag)
flag=temp;}
if(flag>=val)
out=true;}
cur[i][j]=0;
if(max)
if(flag>val)
val=flag;}
else
return flag;
int main()
int m=-10000,val=-10000,dep=1;
int x_pos,y_pos
init();
cout<<"棋盘 " char isfirst; cout<<"你要先下输入y,否则输入n"; cin>>isfirst; while(isfirst!='y'&&isfirst!='n') if(isfirst=='n') cur[x_pos][y_pos]=1; 人工智能 由自然探索于创新课程所想。管理学院李先同 201200272120 人工智能是一个大家看似并不陌生的字眼,我们平时所用的手机,电影中的科幻元素无不充斥着人工智能。由此人工智能变成为了一个人人都知道,却又都不甚了解的事物。通过这学期自然探索与创新课程的学习,我了解到了人工智能的发展简史,更对... 2014 人工智能 作业 1 提交时间10 21 1 食草动物与食肉动物问题。3只食草动物与3只食肉动物在河一边,并有一条船。船能坐一至两只动物。船不能空载。目标是,把每只动物送到河对岸,并且留在某岸边或者船上的食肉动物数不能多于食草动物数。请将此问题转换成一个搜索问题 a.定义一个状态表示。b.给... 1.何谓估价函数,在估价函数中,g n 和h n 各起什么作用?解 估价函数的任务是估计待搜索节点的重要程度,给它们排定次序。g n 是起始点到达n的实际路径代价,h n 就是n到目标点最短路径的启发函数。2.设有如下结构的移动将牌游戏 其中,b表示黑色将牌,w表是白色将牌,e表示空格。游戏的规定走...人工智能作业
人工智能作业
人工智能作业