内容发布更新时间 : 2024/11/5 5:07:25星期一 下面是文章的全部内容请认真阅读。
实验报告
姓名: 叶子烽
学号:
班级:
实验名称:
课程名称: 实验日期: 2220132380 软件二班 启发式搜索 人工智能 2015.11.09
实验环境:
Visual C++
实验目的以及内容:
1、实验内容:使用启发式搜索算法求解八数码问题。 (1)编制程序实现求解八数码问题A*算法,采用估价函数
其中:d(n)是搜索树中节点n的深度;w(n)为节点n的数据库中
错放的棋子个数;p(n)为节点n的数据库中的每个棋子与其目标位置之间的距离的总和。
(2)分析上述(1)中的两种估价函数求解八数码问题的效率差别,给出一个是p(n)的上界的h(n)的定义,并测试使用该估价函数是否使算法失去可采纳性。
2、实验目的:熟练的掌握启发式搜索A*算法及其可采纳性。 3. 实验原理 :八数码问题是在3行和3列构成的九宫棋盘上放置数码为1到8的8个棋盘,剩下一个空格的移动来不断改变棋盘的布局,求解这类问题的方法是:给定初始布局(即初始状态)和目标布局(即目标状态),定义操作算子的直观方法是为每个棋牌制定一套可能的走步》上,下,左,右四种移动,再根据所定义的启发式搜索函数在搜索过程中选择最合适的操作算子,得到最优的路径。
代码:
#include\ #define num 3
void show(int begin[num][num]) {
for(int i = 0; i < num; i++) {
for(int j = 0; j < num; j++) printf(\ printf(\ }
printf(\ }
void exchange(int begin[num][num], int row_one, int column_one, int row_two, int column_two) {
int temp;
temp = begin[row_two][column_two] ;
begin[row_two][column_two] = begin[row_one][column_one]; begin[row_one][column_one] = temp; }
int judge(int begin[num][num], int end[num][num]) {
int count=0;
for(int i = 0; i < num; i++) for(int j = 0; j < num; j++) {
if(begin[i][j] == end[i][j] && end[i][j] != 0) count++; }
return count; }
int yidong(int begin[num][num], int end[num][num] , int right, int jishu, int ji_shu[50][3][3] , int biaoji, int row, int column) {
int temp_zhi;
show(begin);
if(jishu >= 20) return 0;