1、人工智能课程设计资料人工智能课程设计精品文档人工智能 技术报告简介本课程设计是基于 alpha-beta剪枝算法的五子棋的博弈游戏,具有悔棋, 可选择禁手,支持人机对战,人人对战等功能。整个设计基于 Java语言开发,界面美观大方。alpha-beta剪枝技术的基本思想或算法是,边生成博弈树边计算评估各节点 的倒推值,并且根据评估出的倒推值范围,及时停止扩展那些已无必要再扩展 的子节点,即相当于剪去了博弈树上的一些分枝,从而节约了机器开销,提高 了搜索效率。具体的剪枝方法如下:(1) 对于一个与节点 MIN ,若能估计出其倒推值的上确界 ,并且这个 值 不大于 MIN 的父节点 (一定是或节点
2、 )的估计倒推值的下确界 ,即 ,则就 不必再扩展该 MIN 节点的其余子节点了 (因为这些节点的估值对 MIN 父节点的 倒推值已无任何影响 了 )。这一过程称为 剪枝。(2) 对于一个或节点 MAX ,若能估计出其倒推值的下确界 ,并且这个 值不小于 MAX 的父节点 (一定是与节点 )的估计倒推值的上确界 ,即 ,则 就不必再扩展该 MAX 节点的其余子节点了 (因为这些节点的估值对 MAX 父节 点的倒推值已无任何影响 了) 。这一过程称为 剪枝。1、 数据结构定义本文定义 15*15 的五子棋棋盘,实现算法,在算法中采用的数据结构包 括:int isChessOn描述当前棋盘, 0表
3、示黑子, 1表示白字, 2表示无子; int pre 记录棋点的 x, y 坐标。由于本课程设计是基于 Java语言开发的,在 Java中只能用类表示并实现所 定义的数据结构。所以下面将用类来描述相应的数据结构及算法:public class ChessPanelprivate ImageIcon map; / 棋盘背景位图private ImageIcon blackchess; /黑子位图private ImageIcon whitechess ; /白子位图public int isChessOn ; /棋局protected boolean win = false; / 是否已经分出胜
4、负protected int win_bw ; / 胜利棋色protected int deep = 3, weight = 7; / 搜索的深度以及广度public int drawn_num = 110; / 和棋步数int chess_num = 0; / 总落子数目public int pre = new int drawn_num + 12; / 记录下棋点的 x,y 坐标 最多 (drawn_num + 1) 个public int sbw = 0; / 玩家棋色黑色 0,白色 1public int bw = 0; / 当前应该下的棋色 0:黑色 ( 默认 ), 1:白色prot
5、ected int x_max = 15, x_min = 0; / 边界值 ,用于速度优化收集于网络,如有侵权请联系管理员删除精品文档protected int y_max = 15, y_min = 0; / 边界值 ,用于速度优化protected boolean able_flag = true; / 是否选择禁手标志 0:无禁手 1: 有禁手 (默认privateint h;/棋子长privateint w;/棋子宽privateint insx;/插入棋子的位置privateint insy;privatePoint mousePoint ;/鼠标当前位置privateint wi
6、ner ;/获胜方private boolean humanhuman =false ;/ 是否是人人对弈privateint plast=0;/走了几步了,publicint BLACK_ONE ;/0表黑子publicint WHITE_ONE ;/1表白子publicint NONE_ONE ;/2表无子public intN;/棋盘边长/ 搜索当前搜索状态极大值 /alpha 祖先节点得到的当前最小最大值,用于 alpha 剪枝/beta 祖先节点得到的当前最大最小值,用于 beta 剪枝。/step 还要搜索的步数/return 当前搜索子树极大值protected int find
7、Max( int alpha, int beta, int step) int max = alpha;if (step = 0) return evaluate();int rt = getBests(1 - sbw);for (int i = 0; i max)max = t;/beta 剪枝if (max = beta)return max;return max;/ 搜索当前搜索状态极小值 /alpha 祖先节点得到的当前最小最大值,用于 alpha 剪枝/beta 祖先节点得到的当前最大最小值,用于 beta 剪枝/step 还要搜索的步数收集于网络,如有侵权请联系管理员删除精品文档/
8、return 当前搜索子树极小值。protected int findMin( int alpha, int beta, int step) int min = beta;if (step = 0) return evaluate();int rt = getBests( sbw);for (int i = 0; i rt. length; i+) int x = rti0;int y = rti1;int type = getType(x, y, sbw);/玩家成 5if (type = 1)return -100 * ( getMark(1) + step*1000 );/ 预存当前边界
9、值int temp1= x_min ,temp2= x_max ,temp3= y_min ,temp4= y_max ; isChessOnxy = sbw;resetMaxMin(x,y);int t = findMax( alpha, min, step - 1 ); isChessOnxy = 2;/ 还原预设边界值x_min =temp1; x_max =temp2;y_min =temp3;y_max =temp4; if (t min) min = t;/alpha 剪枝 if (min = alpha) return min;return min;/ 选取局部最优的几个落子点作
10、为下一次扩展的节点 /bwf 棋色 0:黑棋 1 :白棋/return 选出来的节点坐标 private int getBests( int bwf) int i_min=( x_min =0 ? x_min :x_min -1);int j_min=( y_min =0 ? y_min :y_min -1);int i_max=( x_max =15 ? x_max :x_max +1);int j_max=( y_max =15 ? y_max :y_max +1);int n = 0;int type_1,type_2;int rt = new int (i_max-i_min) * (
11、j_max-j_min)3;for ( int i = i_min; i i_max; i+)for (int j = j_min; j n? n: weight ; int bests = new int size3; System.arraycopy (rt, 0, bests, 0, size); return bests;3、 程序执行结果初始界面收集于网络,如有侵权请联系管理员删除精品文档人机博弈收集于网络,如有侵权请联系管理员删除精品文档收集于网络,如有侵权请联系管理员删除精品文档人人博弈收集于网络,如有侵权请联系管理员删除精品文档禁手选择收集于网络,如有侵权请联系管理员删除精品文档4、 个人总结、看法本程序是使用 Alpha-Beta 搜索的算法完成的一个简单的五子棋博弈游戏。虽然 Alpha-Beta 已经尽力做到细致、全面,但由于 Alpha-Beta 搜索存在博弈树算法中普遍 存在的一个缺点一随着搜索层数的增加,算法的效率大大下降。所以该搜索的效率还 是不怎么理想,五子棋程序的“智力”也不高。因此可以在上述程序的基础上,针对 五子棋本身的特点和规律对 Alpha-Beta 搜索算法进行优化与修正,比如用启发式搜 索。收集于网络,如有侵权请联系管理员删除
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1