【2017年整理】631306050113程强+状态空间搜索+启发式搜索.doc
文本预览下载声明
重庆交通大学计算机与信息学院
验证性实验报告
班 级: 计算机软件开发专业 2013级1班
学 号: 631306050113
姓 名: 程强
实验项目名称: 状态空间搜索
实验项目性质: 验证性实验
实验所属课程: 人工智能
实验室(中心):软件中心实验室(语音楼8楼)
指 导 教 师 : 朱振国
实验完成时间: 2016 年 6 月 13 日
实验目的
理解和掌握状态空间搜索的策略。
二、实验内容及要求
1.实验内容:在一个3*3的九宫中有1-8个数码及一个空格随即的摆放在其中的格子里,现在要求实验这个问题:将该九宫格调整为某种有序的形式。调整的规则是,每次只能将与空格(上、下、左、右)相邻的一个数字平移到空格中。
2.实验要求:用选定的编程语言编写程序,利用不同的搜索策略进行状态空间搜索(如宽度优先搜索、深度优先搜索、有界深度优先搜索等)
三、实验设备及软件
一台PC,Java
四、设计方案
㈠ 题目 状态空间搜索
㈡ 设计的主要思路
状态空间法
建立一个只含有初始节点S0的搜索图G,把S0放入OPEN表中
建立CLOSED表,且置为空表
判断OPEN表是否为空表,若为空,则问题无解,退出
选择OPEN表中的第一个节点,把它从OPEN表移出,并放入CLOSED表将此节点记为节点n
考察节点n是否为目标节点,若是,则问题有解,成功退出。问题的解就是沿着n到S0的路径得到。若不是转⑥
扩展节点n生成一组不是n的祖先的后继节点,并将它们记为集合M,将M中的这些节点作为n的后继节点加入图G中
对未在G中出现过的(OPEN和CLOSED表中未出现过的)集合M中的节点, 设置一个指向父节点n的指针,并把这些节点放入OPEN表中;对于已在G中出现过的M中的节点,确定是否需要修改指向父节点的指针;对于已在G中出现过,并已在closed表中的M中的节点,确定是否需要修改通向他们后继节点的指针。
按某一任意方式或某种策略重排OPEN表中节点的顺序
转③
宽度优先搜索算法
(1) 把起始节点放到OPEN表中(如果该起始节点为一目标节点,则求得一个解答)。
(2) 如果OPEN是个空表,则没有解,失败退出;否则继续。
(3) 把第一个节点(节点n)从OPEN表移出,并把它放入CLOSED的扩展节点表中。
(4) 扩展节点n。如果没有后继节点,则转向上述第(2)步。
(5) 把n的所有后继节点放到OPEN表末端,并提供从这些后继节点回到n的指针。
(6) 如果n的任一个后继节点是个目标节点,则找到一个解答,成功退出;
否则转向第(2)步。
深度优先搜索算法
(1) 把起始节点放到OPEN表中(如果该起始节点为一目标节点,则求得一个解答)
(2) 如果OPEN是个空表,则没有解,失败退出;否则继续。
(3) 把第一个节点(节点n)从OPEN表移出,并把它放入CLOSED的扩展节点表中。
(4) 考察节点n是否为目标节点,若是,则找到问题的解,用回溯法求解路径,退出
(5)如果没有后继节点,则转向上述第(2)步。
(6) 扩展节点n,把n的所有后继节点放到OPEN表前端,并提供从这些后继节点回到n的指针。转向第(2)步。
㈢ 主要功能
通过一系列的数码移动,讲初始位置转化为目标位置
五、主要代码
package cn.edu.nwsuaf.qhs.artificialintelligence.eightpuzzle;
import java.util.Arrays;
public class EightPuzzle implements Cloneable{
/*利用一个二维的数组来存储数据*/
public int[][] data;
private int blankPos_x,blankPos_y;
private int depth;
//无参构造函数
public EightPuzzle(){
data = new int[3][3];
}
//传递一个数组,进行初始化的构造函数
public EightPuzzle(int [][] data){
this.data = data;
}
//判断是不是和目标位置相同
/*int[][] data1 = new int[][]{{1,2,3},{4,5,6},{7,8,9}};
int[][] data2 = n
显示全部