人工智能导论 启发式图搜索
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
人工智能导论
启发式图搜索
院系名称:地球物理与信息工程学院
专业名称:计算机科学与技术
学号:
姓名:
完成日期2015年 6月 16 日
一、过程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) {} , 计算f(n,) = g(n, ) + h(); g(n, )是从s通过n到的耗散值,f(n,)是从s通过n、到目标节点耗散值的估计;
·ADD( , OPEN), 标记到n的指针。
·IF f(n,) ·IF f(n,) ⑦OPEN中的节点按f值从小到大排列; ⑧GO LOOP。 二、最佳图搜索算法A*: 当在算法A的评价函数中,使用的启发函数h(n)是处在h*(n)的下界范围,即满足h(n)<=h*(n)时,则把这个算法称为算法A*。 在下面解决八数码问题的程序中,采用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 //判断当前节点是不是在OPEN表或者CLOSED表中void addtolist(StateNode &sn,list //根据当前扩展到的节点的类型(mj,mk,ml)选择不同的操作方式void expandnode(StateNode &sn,StateNode &goal,list //扩展节点,计算节点的评价函数值,根据新的节点的类型选择不同的操作list (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<3;i++) { for (int j=0;j<3;j++) { node[i][j]=0; } } } void putstartnode() { cout<<"请输入目标状态!(空闲的格子用0表示)"< for (int i=0;i<3;i++) { for (int j=0;j<3;j++) { cin>>node[i][j]; } } cout< } void putgoalnode() { cout<<"请输入初始状态!(空闲的格子用0表示)"< for (int i=0;i<3;i++) { for (int j=0;j<3;j++) { cin>>node[i][j]; } } cout< } int getnode(int i,int j) //读取node[i][j] { return node[i][j]; } void swap(int i,int j,int m,int n) //交换数组中指定位置的两个元素的数值{ int temp; temp=node[i][j]; node[i][j]=node[m][n]; node[m][n]=temp; } bool operator ==(StateNode &sn) //重载了运算符==,方便后面进行比较{