人工智能课程设计资料.docx
《人工智能课程设计资料.docx》由会员分享,可在线阅读,更多相关《人工智能课程设计资料.docx(9页珍藏版)》请在冰豆网上搜索。
人工智能课程设计资料
人工智能课程设计
精品文档
人工智能<五子棋>技术报告
简介
本课程设计是基于alpha-beta剪枝算法的五子棋的博弈游戏,具有悔棋,可选择禁手,支持人机对战,人人对战等功能。
整个设计基于Java语言开发,
界面美观大方。
alpha-beta剪枝技术的基本思想或算法是,边生成博弈树边计算评估各节点的倒推值,并且根据评估出的倒推值范围,及时停止扩展那些已无必要再扩展的子节点,即相当于剪去了博弈树上的一些分枝,从而节约了机器开销,提高了搜索效率。
具体的剪枝方法如下:
(1)对于一个与节点MIN,若能估计出其倒推值的上确界β,并且这个β值不大于MIN的父节点(一定是或节点)的估计倒推值的下确界α,即α≥,β则就不必再扩展该MIN节点的其余子节点了(因为这些节点的估值对MIN父节点的倒推值已无任何影响了)。
这一过程称为α剪枝。
(2)对于一个或节点MAX,若能估计出其倒推值的下确界α,并且这个α值不小于MAX的父节点(一定是与节点)的估计倒推值的上确界β,即α≥,β则就不必再扩展该MAX节点的其余子节点了(因为这些节点的估值对MAX父节点的倒推值已无任何影响了)。
这一过程称为β剪枝。
1、数据结构定义
本文定义15*15的五子棋棋盘,实现算法,在算法中采用的数据结构包括:
intisChessOn[][]描述当前棋盘,0表示黑子,1表示白字,2表示无子;intpre[][]记录棋点的x,y坐标。
由于本课程设计是基于Java语言开发的,在Java中只能用类表示并实现所定义的数据结构。
所以下面将用类来描述相应的数据结构及算法:
publicclassChessPanel{
privateImageIconmap;//棋盘背景位图
privateImageIconblackchess;//黑子位图
privateImageIconwhitechess;//白子位图
publicintisChessOn[][];//棋局
protectedbooleanwin=false;//是否已经分出胜负
protectedintwin_bw;//胜利棋色
protectedintdeep=3,weight=7;//搜索的深度以及广度
publicintdrawn_num=110;//和棋步数
intchess_num=0;//总落子数目
publicint[][]pre=newint[drawn_num+1][2];//记录下棋点的x,y坐标最多(drawn_num+1)个
publicintsbw=0;//玩家棋色黑色0,白色1
publicintbw=0;//当前应该下的棋色0:
黑色(默认),1:
白色
protectedintx_max=15,x_min=0;//边界值,用于速度优化
收集于网络,如有侵权请联系管理员删除
精品文档
protectedinty_max=15,y_min=0;//边界值,用于速度优化
protectedbooleanable_flag=true;//是否选择禁手标志0:
无禁手1:
有禁手(默认
private
inth;
//棋子长
private
intw;
//棋子宽
private
intinsx;
//插入棋子的位置
private
intinsy;
private
PointmousePoint;
//鼠标当前位置
private
intwiner;
//获胜方
privatebooleanhumanhuman=false;
//是否是人人对弈
private
intplast=0;
//走了几步了,
public
intBLACK_ONE;
//0表黑子
public
intWHITE_ONE;
//1表白子
public
intNONE_ONE;
//2表无子
publicint
N;
//棋盘边长
//搜索当前搜索状态极大值//
//alpha祖先节点得到的当前最小最大值,用于alpha剪枝
//beta祖先节点得到的当前最大最小值,用于beta剪枝。
//step还要搜索的步数
//return当前搜索子树极大值
protectedintfindMax(intalpha,intbeta,intstep){
intmax=alpha;
if(step==0){
returnevaluate();
}
int[][]rt=getBests(1-sbw);
for(inti=0;iintx=rt[i][0];
inty=rt[i][1];
if(getType(x,y,1-sbw)==1)//电脑可取胜
return100*(getMark
(1)+step*1000);isChessOn[x][y]=1-sbw;
//预存当前边界值
inttemp1=x_min,temp2=x_max,temp3=y_min,temp4=y_max;resetMaxMin(x,y);
intt=findMin(max,beta,step-1);
isChessOn[x][y]=2;
//还原预设边界值
x_min=temp1;
x_max=temp2;
y_min=temp3;
y_max=temp4;
if(t>max)
max=t;
//beta剪枝
if(max>=beta)
returnmax;
}
returnmax;
}
//搜索当前搜索状态极小值//
//alpha祖先节点得到的当前最小最大值,用于alpha剪枝
//beta祖先节点得到的当前最大最小值,用于beta剪枝
//step还要搜索的步数
收集于网络,如有侵权请联系管理员删除
精品文档
//return当前搜索子树极小值。
protectedintfindMin(intalpha,intbeta,intstep){
intmin=beta;
if(step==0){returnevaluate();
}
int[][]rt=getBests(sbw);
for(inti=0;iintx=rt[i][0];
inty=rt[i][1];
inttype=getType(x,y,sbw);
//玩家成5
if(type==1)
return-100*(getMark
(1)+step*1000);
//预存当前边界值
inttemp1=x_min,temp2=x_max,temp3=y_min,temp4=y_max;isChessOn[x][y]=sbw;
resetMaxMin(x,y);
intt=findMax(alpha,min,step-1);isChessOn[x][y]=2;
//还原预设边界值
x_min=temp1;x_max=temp2;
y_min=temp3;
y_max=temp4;if(t//alpha剪枝if(min<=alpha){
returnmin;
}
}
returnmin;
}
//选取局部最优的几个落子点作为下一次扩展的节点//
//bwf棋色0:
黑棋1:
白棋
//return选出来的节点坐标privateint[][]getBests(intbwf){
inti_min=(x_min==0?
x_min:
x_min-1);
intj_min=(y_min==0?
y_min:
y_min-1);
inti_max=(x_max==15?
x_max:
x_max+1);
intj_max=(y_max==15?
y_max:
y_max+1);
intn=0;
inttype_1,type_2;
int[][]rt=newint[(i_max-i_min)*(j_max-j_min)][3];
for(inti=i_min;ifor(intj=j_min;jcontinue;rt[n][0]=i;
收集于网络,如有侵权请联系管理员删除
精品文档
rt[n][1]=j;
rt[n][2]=getMark(type_1)+getMark(type_2);n++;
}
//对二维数组排序
Arrays.sort(rt,newArrComparator());intsize=weight>n?
n:
weight;int[][]bests=newint[size][3];System.arraycopy(rt,0,bests,0,size);returnbests;
}}
3、程序执行结果
初始界面
收集于网络,如有侵权请联系管理员删除
精品文档
人机博弈
收集于网络,如有侵权请联系管理员删除
精品文档
收集于网络,如有侵权请联系管理员删除
精品文档
人人博弈
收集于网络,如有侵权请联系管理员删除
精品文档
禁手选择
收集于网络,如有侵权请联系管理员删除
精品文档
4、个人总结、看法
本程序是使用Alpha-Beta搜索的算法完成的一个简单的五子棋博弈游戏。
虽然Alpha-Beta已经尽力做到细致、全面,但由于Alpha-Beta搜索存在博弈树算法中普遍存在的一个缺点一随着搜索层数的增加,算法的效率大大下降。
所以该搜索的效率还是不怎么理想,五子棋程序的“智力”也不高。
因此可以在上述程序的基础上,针对五子棋本身的特点和规律对Alpha-Beta搜索算法进行优化与修正,比如用启发式搜索。
收集于网络,如有侵权请联系管理员删除