(完整版)启发式搜索算法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
人工智能基础实验报告
实验名称:八数码问题
姓名:张俊
学号:2220092333
指导老师:邓安生
启发式搜索算法
1. 实验内容:
使用启发式搜索算法求解8数码问题。
⑴ 编制程序实现求解8数码问题A *算法,采用估价函数
()()()()
w n f n d n p n ⎧⎪=+⎨⎪⎩, 其中:()d n 是搜索树中结点n 的深度;()w n 为结点n 的数据库中错放的棋子个数;()p n 为结点n 的数据库中每个棋子与其目标位置之间的距离总和。
⑵ 分析上述⑴中两种估价函数求解8数码问题的效率差别,给出一个是()p n 的上界的()h n 的定义,并测试使用该估价函数是否使算法失去可采纳性。
2. 实验目的
熟练掌握启发式搜索A *算法及其可采纳性。
3. 实验原理
八数码问题是在3行和3列构成的九宫棋盘上放置数码为1到8的8个棋盘,剩下一个空格的移动来不断改变棋盘的布局,求解这类问题的方法是:给定初始布局(即初始状态)和目标布局(即目标状态),定义操作算子的直观方法是为每个棋牌制定一套可能的走步》上,下,左,右四种移动,再根据所定义的启发式搜索函数在搜索过程中选择最合适的操作算子,得到最优的路径。
4.源代码
#include
#include
#include
#include
#include
#include
#include
using namespace std;
static int space=0;
int target[9];
class EightNum//定义一个EightNum 类
{
public:
int num[9];
int f;//初始状态与目标状态相比,棋子错放个数
int deap;//深度
int evalfun;//状态的估价值
EightNum *parent;
//以下为类内成员函数的声明
EightNum(int nnum[9]);
int get_evalfun();
int get_deapfun();
void eval_func(int id);
int Canspread(int n);
void Spreadchild(int n);
void getnum(int num1[9]);
void setnum(int num1[9]);
void show(void);
int operator ==(EightNum& NewEightN);
int operator ==(int num2[9]);
int Shownum();
};
//-----------------------以下为EightNum类成员函数定义-----------------// class Stack
{
private:
EightNum * eightnum;
public:
Stack * next;
EightNum * Minf();
EightNum * Belong(EightNum * suc);
void Putinto(EightNum * suc);
};
EightNum::EightNum(int nnum[9]){//此函数功能为:初始化num[];for(int i=0;i<9;i++)
num[i]=nnum[i];
f=0;
deap=0;
parent=NULL;
}
int EightNum::get_evalfun(){
return evalfun;
}
int EightNum::get_deapfun(){
return deap;
}
void EightNum::eval_func(int id){//此函数为估价函数
int i,qifa;
qifa=0;
switch(id){
case 1:{
for(i=0;i<9;i++){
if(num[i]!=target[i])
qifa++;
}
break;
}
case 2:{
int j, h1,h2;
for(i=0;i<9;i++){
for(j=0;j<9;j++){
if(num[j]==i)h1=j;
if(target[j]==i)h2=j;
}
qifa+=(int)(fabs((double)(h1/3 - h2/3)) + fabs((double)(h1%3 - h2%3)));
}
break;
}
case 3:{
int j, h1,h2;
for(i=0;i<9;i++){
for(j=0;j<9;j++){
if(num[j]==i)h1=j;
if(target[j]==i)h2=j;
}
qifa+=(int)(fabs((double)(h1/3 - h2/3)) + fabs((double)(h1%3 - h2%3)));
}
qifa=3*qifa;
break;
}
default :break;
}
f=qifa;
if(this->parent==NULL) deap=0;
else deap=this->parent->deap+1;
evalfun=deap+f;
}