启发式图搜索过程

姓名:

学号:

启发式图搜索过程

一、过程A描述:

① OPEN := (s), f(s) := g(s) + h(s);

② LOOP : IF OPEN=() THEN EXIT(FAIL);

③ n := FIRST(OPEN);

④ IF GOAL(n) THEN EXIT(SUCCESS);

⑤ REMOVE(n, OPEN) , ADD(n, CLOSED);

⑥ EXPAND(n)  {mi} , 计算f(n, mi) = g(n, mi) + h(mi); g(n, mi)是从s通过n到mi的耗散值,f(n, mi)是从s通过n、mi到目标节点耗散值的估计;

·ADD(mj , OPEN), 标记mi到n的指针。

·IF f(n, mk)

·IF f(n, ml)

⑧ GO LOOP。

二、最佳图搜索算法A*:

当在算法A的评价函数中,使用的启发函数h(n)是处在h*(n)的下界范围,即满足h(n)

在下面解决八数码问题的程序中,采用h(n)=P(n), P(n)定义为每一个将牌与其目标位置之间的距离的总和。

三、算法实现

(1)数据结构

class StateNode{

public:

int gs,hs,fs; //分别表示算法中的g(n)、h(n)、f(n)

StateNode *psn; //一个指向扩展出它的父节点的指针 StateNode(); //构造函数,初始化节点 void putstartnode(); //输入开始节点 void putgoalnode(); //输入目标节点 int getnode(int i,int j); //读取node[i][j] void swap(int i,int j,int m,int n); //交换数组中指定位置的两个元素的数值 bool operator ==(StateNode &sn); //重载了运算符==,方便后面进行比较 void operator =(StateNode &sn); //重载了运算符=,方便后面对节点进行整体赋值

void printstatenode();

//将每个节点的内容按照一定格式输出 private:

int node[3][3]; //八数码的每个节点用一个二维数组存储 };

void evaluatefunction(StateNode &sn,StateNode &goal);

//启发函数,计算某个节点的h(n)值

bool isgoal(StateNode &sn,StateNode &goal);

//判断当前节点是否目标节点

bool uninlist(StateNode &sn,list &lsn);

//判断当前节点是不是在OPEN表或者CLOSED表中

void addtolist(StateNode &sn,list &lsn,list &lcsn);

//根据当前扩展到的节点的类型(mj,mk,ml)选择不同的操作方式

void expandnode(StateNode &sn,StateNode &goal,list &lsn,list &lcsn);

//扩展节点,计算节点的评价函数值,根据新的节点的类型选择不同的操作

list OPEN; //使用STL中的list类型来存放OPEN表 list CLOSED; //使用STL中的list类型来存放CLOSED表

(2)运行过程演示:

四、程序代码(C++):

#include

#include

#include

using namespace std;

#define MAXNUM 1000

class StateNode

{

public:

int gs,hs,fs;

StateNode *psn;

StateNode()

{

gs=0;hs=0;fs=gs+hs;

psn=0;

for (int i=0;i

{ for (int j=0;j>node[i][j]; } } cout>node[i][j]; } } cout

for (int i=0;i

{

for (int j=0;j

{

if (node[i][j]==sn.getnode(i,j))

{

n++;

}

}

}

if (n

{

return false;

}

else return true;

}

void operator =(StateNode &sn)

{

for (int i=0;i

{

for (int j=0;j

{

node[i][j]=sn.getnode(i,j);

}

}

this->gs=sn.gs;

this->hs=sn.hs;

this->fs=sn.fs;

this->psn=sn.psn;

}

void printstatenode()

{

for (int i=0;i

{

for (int j=0;j

{

cout

}

cout

}

}

protected:

private: //重载了运算符=,方便后面对节点进行整体赋值 //将每个节点的内容按照一定格式输出

};

void evaluatefunction(StateNode &sn,StateNode &goal) //启发函数,计算某个节点的h(n)值 {

for (int i=0;i

{

for (int j=0;j

{

if (sn.getnode(i,j)!=goal.getnode(i,j) && sn.getnode(i,j)!=0)

{

for (int m=0;m

{

for (int n=0;n

{

if (sn.getnode(i,j)==goal.getnode(m,n))

{

sn.hs+=(abs(i-m)+abs(j-n));

}

}

}

}

}

}

}

bool isgoal(StateNode &sn,StateNode &goal) //判断当前节点是否目标节点 {

return sn==goal;

}

bool uninlist(StateNode &sn,list &lsn)

{

}

//判断当前节点是不是在OPEN表或者CLOSED表中 list::iterator iter; for (iter=lsn.begin();iter!=lsn.end();iter++) { if (*iter==sn) { return false; } } return true;

void addtolist(StateNode &sn,list &lsn,list &lcsn)

{ //根据当前扩展到的节点的类型(mj,mk,ml)选择不同的操作方式 list::iterator iter;

list::iterator iterc;

if (uninlist(sn,lsn) && uninlist(sn,lcsn))

{

for (iter=lsn.begin();iter!=lsn.end() && sn.fs>=iter->fs;iter++){}

lsn.insert(iter,sn);

}

else if(!uninlist(sn,lsn))

{

for (iter=lsn.begin();iter!=lsn.end();iter++)

{

if (*iter==sn) {break;}

}

if (iter->fs>sn.fs) {*iter=sn;}

}

else if (!uninlist(sn,lcsn))

{

for (iterc=lcsn.begin();iterc!=lcsn.end();iterc++)

{

if (*iterc==sn) {break;}

}

if(iterc->fs>sn.fs)

{

for (iter=lsn.begin();iter!=lsn.end() && sn.fs>=iter->fs;iter++){}

lsn.insert(iter,*lcsn.erase(iterc));

}

}

}

void evaluandadd(StateNode &temsn,StateNode &sn,StateNode &goal,list &lsn,list &lcsn)

{

temsn.gs=sn.gs+1;

temsn.hs=0;

evaluatefunction(temsn,goal);

temsn.fs=temsn.gs+temsn.hs;

addtolist(temsn,lsn,lcsn);

}

void expandnode(StateNode &sn,StateNode &goal,list &lsn,list &lcsn)

{ //扩展节点,计算节点的评价函数值,根据新的节点的类型选择不同的操作 StateNode temsn;

list::iterator iter; for (int i=0;i0) //向左移动 { temsn=sn; temsn.swap(i,j,i-1,j); temsn.psn=&sn; evaluandadd(temsn,sn,goal,lsn,lcsn); }

if (i

temsn=sn;

temsn.swap(i,j,i+1,j);

temsn.psn=&sn;

evaluandadd(temsn,sn,goal,lsn,lcsn); }

if (j>0) //向上移动 {

temsn=sn;

temsn.swap(i,j,i,j-1);

temsn.psn=&sn;

evaluandadd(temsn,sn,goal,lsn,lcsn); }

if (j

temsn=sn;

temsn.swap(i,j,i,j+1);

temsn.psn=&sn;

evaluandadd(temsn,sn,goal,lsn,lcsn); }

}

}

}

}

int main()

{

StateNode Start,SN[MAXNUM],Goal;

int i,j=0;

} list OPEN; list CLOSED; list::iterator iter; list::iterator iterc; Goal.putgoalnode(); Start.putstartnode(); evaluatefunction(Start,Goal); Start.gs=0; Start.fs=Start.gs+Start.hs; OPEN.push_back(Start); for (iter=OPEN.begin(),i=0;iter!=OPEN.end() && ipsn,j++) { coutprintstatenode(); coutMAXNUM) { cout

姓名:

学号:

启发式图搜索过程

一、过程A描述:

① OPEN := (s), f(s) := g(s) + h(s);

② LOOP : IF OPEN=() THEN EXIT(FAIL);

③ n := FIRST(OPEN);

④ IF GOAL(n) THEN EXIT(SUCCESS);

⑤ REMOVE(n, OPEN) , ADD(n, CLOSED);

⑥ EXPAND(n)  {mi} , 计算f(n, mi) = g(n, mi) + h(mi); g(n, mi)是从s通过n到mi的耗散值,f(n, mi)是从s通过n、mi到目标节点耗散值的估计;

·ADD(mj , OPEN), 标记mi到n的指针。

·IF f(n, mk)

·IF f(n, ml)

⑧ GO LOOP。

二、最佳图搜索算法A*:

当在算法A的评价函数中,使用的启发函数h(n)是处在h*(n)的下界范围,即满足h(n)

在下面解决八数码问题的程序中,采用h(n)=P(n), P(n)定义为每一个将牌与其目标位置之间的距离的总和。

三、算法实现

(1)数据结构

class StateNode{

public:

int gs,hs,fs; //分别表示算法中的g(n)、h(n)、f(n)

StateNode *psn; //一个指向扩展出它的父节点的指针 StateNode(); //构造函数,初始化节点 void putstartnode(); //输入开始节点 void putgoalnode(); //输入目标节点 int getnode(int i,int j); //读取node[i][j] void swap(int i,int j,int m,int n); //交换数组中指定位置的两个元素的数值 bool operator ==(StateNode &sn); //重载了运算符==,方便后面进行比较 void operator =(StateNode &sn); //重载了运算符=,方便后面对节点进行整体赋值

void printstatenode();

//将每个节点的内容按照一定格式输出 private:

int node[3][3]; //八数码的每个节点用一个二维数组存储 };

void evaluatefunction(StateNode &sn,StateNode &goal);

//启发函数,计算某个节点的h(n)值

bool isgoal(StateNode &sn,StateNode &goal);

//判断当前节点是否目标节点

bool uninlist(StateNode &sn,list &lsn);

//判断当前节点是不是在OPEN表或者CLOSED表中

void addtolist(StateNode &sn,list &lsn,list &lcsn);

//根据当前扩展到的节点的类型(mj,mk,ml)选择不同的操作方式

void expandnode(StateNode &sn,StateNode &goal,list &lsn,list &lcsn);

//扩展节点,计算节点的评价函数值,根据新的节点的类型选择不同的操作

list OPEN; //使用STL中的list类型来存放OPEN表 list CLOSED; //使用STL中的list类型来存放CLOSED表

(2)运行过程演示:

四、程序代码(C++):

#include

#include

#include

using namespace std;

#define MAXNUM 1000

class StateNode

{

public:

int gs,hs,fs;

StateNode *psn;

StateNode()

{

gs=0;hs=0;fs=gs+hs;

psn=0;

for (int i=0;i

{ for (int j=0;j>node[i][j]; } } cout>node[i][j]; } } cout

for (int i=0;i

{

for (int j=0;j

{

if (node[i][j]==sn.getnode(i,j))

{

n++;

}

}

}

if (n

{

return false;

}

else return true;

}

void operator =(StateNode &sn)

{

for (int i=0;i

{

for (int j=0;j

{

node[i][j]=sn.getnode(i,j);

}

}

this->gs=sn.gs;

this->hs=sn.hs;

this->fs=sn.fs;

this->psn=sn.psn;

}

void printstatenode()

{

for (int i=0;i

{

for (int j=0;j

{

cout

}

cout

}

}

protected:

private: //重载了运算符=,方便后面对节点进行整体赋值 //将每个节点的内容按照一定格式输出

};

void evaluatefunction(StateNode &sn,StateNode &goal) //启发函数,计算某个节点的h(n)值 {

for (int i=0;i

{

for (int j=0;j

{

if (sn.getnode(i,j)!=goal.getnode(i,j) && sn.getnode(i,j)!=0)

{

for (int m=0;m

{

for (int n=0;n

{

if (sn.getnode(i,j)==goal.getnode(m,n))

{

sn.hs+=(abs(i-m)+abs(j-n));

}

}

}

}

}

}

}

bool isgoal(StateNode &sn,StateNode &goal) //判断当前节点是否目标节点 {

return sn==goal;

}

bool uninlist(StateNode &sn,list &lsn)

{

}

//判断当前节点是不是在OPEN表或者CLOSED表中 list::iterator iter; for (iter=lsn.begin();iter!=lsn.end();iter++) { if (*iter==sn) { return false; } } return true;

void addtolist(StateNode &sn,list &lsn,list &lcsn)

{ //根据当前扩展到的节点的类型(mj,mk,ml)选择不同的操作方式 list::iterator iter;

list::iterator iterc;

if (uninlist(sn,lsn) && uninlist(sn,lcsn))

{

for (iter=lsn.begin();iter!=lsn.end() && sn.fs>=iter->fs;iter++){}

lsn.insert(iter,sn);

}

else if(!uninlist(sn,lsn))

{

for (iter=lsn.begin();iter!=lsn.end();iter++)

{

if (*iter==sn) {break;}

}

if (iter->fs>sn.fs) {*iter=sn;}

}

else if (!uninlist(sn,lcsn))

{

for (iterc=lcsn.begin();iterc!=lcsn.end();iterc++)

{

if (*iterc==sn) {break;}

}

if(iterc->fs>sn.fs)

{

for (iter=lsn.begin();iter!=lsn.end() && sn.fs>=iter->fs;iter++){}

lsn.insert(iter,*lcsn.erase(iterc));

}

}

}

void evaluandadd(StateNode &temsn,StateNode &sn,StateNode &goal,list &lsn,list &lcsn)

{

temsn.gs=sn.gs+1;

temsn.hs=0;

evaluatefunction(temsn,goal);

temsn.fs=temsn.gs+temsn.hs;

addtolist(temsn,lsn,lcsn);

}

void expandnode(StateNode &sn,StateNode &goal,list &lsn,list &lcsn)

{ //扩展节点,计算节点的评价函数值,根据新的节点的类型选择不同的操作 StateNode temsn;

list::iterator iter; for (int i=0;i0) //向左移动 { temsn=sn; temsn.swap(i,j,i-1,j); temsn.psn=&sn; evaluandadd(temsn,sn,goal,lsn,lcsn); }

if (i

temsn=sn;

temsn.swap(i,j,i+1,j);

temsn.psn=&sn;

evaluandadd(temsn,sn,goal,lsn,lcsn); }

if (j>0) //向上移动 {

temsn=sn;

temsn.swap(i,j,i,j-1);

temsn.psn=&sn;

evaluandadd(temsn,sn,goal,lsn,lcsn); }

if (j

temsn=sn;

temsn.swap(i,j,i,j+1);

temsn.psn=&sn;

evaluandadd(temsn,sn,goal,lsn,lcsn); }

}

}

}

}

int main()

{

StateNode Start,SN[MAXNUM],Goal;

int i,j=0;

} list OPEN; list CLOSED; list::iterator iter; list::iterator iterc; Goal.putgoalnode(); Start.putstartnode(); evaluatefunction(Start,Goal); Start.gs=0; Start.fs=Start.gs+Start.hs; OPEN.push_back(Start); for (iter=OPEN.begin(),i=0;iter!=OPEN.end() && ipsn,j++) { coutprintstatenode(); coutMAXNUM) { cout


相关内容

  • 人工智能启发式图搜索算法
  • 启发式图搜索算法 摘 要:启发式搜索策略概述和有序搜索.启发式搜索弥补盲目搜索的不足,提高搜索效率.一种方法用于排列待扩展节点的顺序,即选择最有希望的节点加以扩展,那么,搜索效率将会大为提高.进行搜索技术一般需要某些有关具体问题领域的特性的信息. 关键词:启发式搜索:估价函数:有序搜索:A*算法: ...

  • 一种基于Dijkstra算法的启发式最优路径搜索算法
  • 第29卷第3期2007年3月 北J咖mal 京科技大学学报 VOI.29NO.3 ofUnive体ityofscienceand7Ikh∞Io留&ijiIIg Mar.2007 一种基于Dijkstra算法的启发式最优路径搜索算法 王景存1,2' 张晓彤1' 陈 彬2' 陈和平2' 1)北京 ...

  • 人工智能算法综述
  • 人工智能算法综述 人工智能算法大概包括五大搜索技术,包括一些早期的搜索技术或用于解决比较简单问题的搜索原理和一些比较新的能够求解比较复杂问题的搜索原理,如遗传算法和模拟退火算法等. 一.盲目搜索 盲目搜索又叫做无信息搜索,一般只适用于求解比较简单的问题. 包括图搜索策略,宽度优先搜索和深度优先搜素. ...

  • 搜索技术在人工智能领域的实际应用
  • 搜索技术在人工智能领域的实际应用 摘要:介绍了搜索引擎的分类.工作原理,并具体分析了搜索引擎的体系结构,包括信息的搜集系统.索引系统以及查询接口.基于现在人工智能技术的迅速发展,对于在搜索引擎中运用的人工智能技术进行了研究,且着重分析了搜索引擎重要模块: Robot的智能化.智能代理技术以及查询接口 ...

  • 人工智能a算法
  • 1.启发式搜索算法A 启发式搜索算法A ,一般简称为A 算法,是一种典型的启发式搜索算法.其基本思想是:定义一个评价函数f ,对当前的搜索状态进行评估,找出一个最有希望的节点来扩展. 评价函数的形式如下: f (n )=g (n )+h (n ) 其中n 是被评价的节点. f (n ).g (n ) ...

  • 旅行商问题_TSP_的几种求解方法
  • 第23卷 第08期 文章编号:1006-9348(2006) 08-0153-05 计 算 机 仿 真 2006年08月 旅行商问题(TSP) 的几种求解方法 田贵超, 黎明, 韦雪洁 (南昌航空工业学院测试技术与控制工程系, 江西南昌330034) 摘要:旅行商问题(TSP) 是组合优化领域里的一 ...

  • 禁忌搜索算法求解旅行商问题研究
  • 第!"卷第#期西南师范大学学报(自然科学版)!$$!年%月 &'()!"*')#+',-./('01',234562738./*'-9/(:.8;5-682 文章编号:>$$$?@">(!$$!)$#$#@>$? 禁忌搜索算法求解旅行商问题研究 ...

  • 蚁群算法基本原理及综述
  • 摘 要:虽然蚁群算法出现时间并不长,但由于其自身具有较好的鲁棒性,以及较强的正反馈机制,使得其在解决TSP问题中取得了较好的成果.在其他问题的解决中,由于其全局搜索性较差,极易出现局部收敛.文章通过对蚁群算法的基本原理与相关方法进行分析,以期对相关问题的改善提供借鉴与参考. 关键词:蚁群算法:基本原 ...

  • 人工智能-启发式搜索
  • 实验报告 姓名: 叶子烽 学号: 班级: 实验名称: 课程名称: 实验日期: 2220132380 软件二班 启发式搜索 人工智能 2015.11.09 实验环境: Visual C++ 实验目的以及内容: 1.实验内容:使用启发式搜索算法求解八数码问题. (1)编制程序实现求解八数码问题A*算法, ...