人工智能(A星算法)

上传人:lis****210 文档编号:124482405 上传时间:2022-07-25 格式:DOCX 页数:12 大小:148.70KB
收藏 版权申诉 举报 下载
人工智能(A星算法)_第1页
第1页 / 共12页
人工智能(A星算法)_第2页
第2页 / 共12页
人工智能(A星算法)_第3页
第3页 / 共12页
资源描述:

《人工智能(A星算法)》由会员分享,可在线阅读,更多相关《人工智能(A星算法)(12页珍藏版)》请在装配图网上搜索。

1、A*算法实验报告实验目的1. 熟悉和掌握启发式搜索的定义、估价函数和算法过程2. 学会利用A*算法求解N数码难题3. 理解求解流程和搜索顺序实验原理A*算法是一种有序搜索算法,其特点在于对估价函数的定义上。对于一般的 有序搜索,总是选择f值最小的节点作为扩展节点。因此,f是根据需要找到一 条最小代价路径的观点来估算节点的,所以,可考虑每个节点n的估价函数值为 两个分量:从起始节点到节点n的代价以及从节点n到达目标节点的代价。实验条件1. Window NT/xp/7及以上的操作系统2. 内存在512M以上3. CPU在奔腾II以上实验内容1. 分别以8数码和15数码为例实际求解A*算法2. 画

2、出A*算法求解框图3. 分析估价函数对搜索算法的影响4. 分析A*算法的特点实验分析1. A*算法基本步骤1)生成一个只包含开始节点n0的搜索图G,把n0放在一个叫OPEN的列表上。2)生成一个列表CLOSED,它的初始值为空。3)如果OPEN表为空,则失败退出。4)选择OPEN上的第一个节点,把它从OPEN中移入CLPSED,称该节点为n。5)如果n是目标节点,顺着G中,从n到q的指针找到一条路径,获得解决方 案,成功退出(该指针定义了一个搜索树,在第7步建立)。6)扩展节点n,生成其后继结点集M,在G中,n的祖先不能在M中。在G中安 置M的成员,使他们成为n的后继。7)从M的每一个不在G中

3、的成员建立一个指向n的指针(例如,既不在OPEN中, 也不在CLOSED中)。把M1的这些成员加到OPEN中。对M的每一个已在OPEN中或 CLOSED中的成员m,如果到目前为止找到的到达m的最好路径通过n,就把它 的指针指向n。对已在CLOSE D中的M的每一个成员,重定向它在G中的每一个 后继,以使它们顺着到目前为止发现的最好路径指向它们的祖先。8)按递增f*值,重排OPEN(相同最小f*值可根据搜索树中的最深节点来解决)。9)返回第3步。在第7步中,如果搜索过程发现一条路径到达一个节点的代价比现存的路径 代价低,就要重定向指向该节点的指针。已经在CLOSED中的节点子孙的重定向保 存了后

4、面的搜索结果,但是可能需要指数级的计算代价。实验步骤算法流程图程序代码#include #include #include using namespace std;const int ROW = 3;/行数const int COL = 3;/列数const int MAXDISTANCE = 10000;/最多可以有的表的数目 const int MAXNUM = 10000;typedef struct _Nodeint digitROWCOL;int dist; 一个表和目的表的距离int dep; / t 深度int index; /节点的位置 Node;Node src, dest;

5、/父节表目的表vector node_v; /存储节点bool isEmptyOfOPEN() /open 表是否为空for (int i = 0; i node_v.size(); i+) if (node_vi.dist != MAXNUM) return false; return true;bool isEqual(int index, int digitCOL) /判断这个最优的节点是否和目的节点一样for (int i = 0; i ROW; i+)for (int j = 0; j COL; j+) if (node_vindex.digitij != digitij)retur

6、n false;return true; ostream& operator(ostream& os, Node& node) for (int i = 0; i ROW; i+) for (int j = 0; j COL; j+)os node.digitij ;os endl;return os; void PrintSteps(int index, vector& rstep_v)/ 输出每一个遍历的节点深度遍历rstep_v.push_back(node_vindex);index = node_vindex.index;while (index != 0)rstep_v.push_

7、back(node_vindex);index = node_vindex.index;for (int i = rstep_v.size() - 1; i = 0; i-)/输出每一步的 探索过程cout Step rstep_v.size() - i endl rstep_vi endl;void Swap(int& a, int& b)int t;t a;a b;b t;void Assign(Node& node, int index)for (int i = 0; i ROW; i+)for (int j = 0; j COL; j+)node.digitij = node_vind

8、ex.digitij;int GetMinNode() /找到最小的节点的位置 即最优节点int dist = MAXNUM;int loc; / the location of minimize nodefor (int i = 0; i node_v.size(); i+)if (node_vi.dist = MAXNUM) continue;else if (node_vi.dist + node_vi.dep) dist) loc = i;dist = node_vi.dist + node_vi.dep;return loc;bool isExpandable(Node& node)

9、for (int i = 0; i node_v.size(); i+) if (isEqual(i, node.digit) return false;return true;int Distance(Node& node, int digitCOL)int distance = 0;bool flag = false;for(int i = 0; i ROW; i+)for (int j = 0; j COL; j+)for (int k = 0; k ROW; k+) for (int l = 0; l COL; l+) if (node.digitij = digitkl) dista

10、nce += abs(i - k) + abs(j - l); flag = true;break;elseflag = false;if (flag) break;return distance;int MinDistance(int a, int b) return (a b ? a : b);void ProcessNode(int index)int x, y;bool flag;for (int i = 0; i ROW; i+) for (int j = 0; j 0)Swap(node_up.digitxy, node_up.digitx - 1y);if (isExpandab

11、le(node_up)dist_up = Distance(node_up, dest.digit);node_up.index = index;node_up.dist = dist_up;node_up.dep = node_vindex.dep + 1;node_v.push_back(node_up);Node node_down;Assign(node_down, index);/ 向下扩展的节点 int dist_down = MAXDISTANCE; if (x 0)Swap(node_left.digitxy, node_left.digitxy - 1);if (isExpa

12、ndable(node_left)dist_left = Distance(node_left, dest.digit);node_left.index = index;node_left.dist = dist_left;node_left.dep = node_vindex.dep + 1;node_v.push_back(node_left);Node node_right;Assign(node_right, index);/ 向右扩展的节点int dist_right = MAXDISTANCE;if (y 2)Swap(node_right.digitxy, node_right.

13、digitxy + 1);if (isExpandable(node_right)dist_right = Distance(node_right, dest.digit);node_right.index = index;node_right.dist = dist_right;node_right.dep = node_vindex.dep + 1;node_v.push_back(node_right);node_vindex.dist = MAXNUM;int main() / 主函数int number;cout Input source: endl;for (int i = 0;

14、i ROW; i+)/输入初始的表 for (int j = 0; j number;src.digitij = number;src.index = 0;src.dep = 1;cout Input destination: endl;/输入目的表for (int m = 0; m ROW; m+)for (int n = 0; n number;dest.digitmn = number;node_v.push_back(src);/在容器的尾部加一个数据cout Search. endl;clock_t start = clock();while (1)if (isEmptyOfOPEN

15、()cout Cannt solve this statement! endl;return -1;elseint loc; / the location of the minimize node 最优节点的 位置loc = GetMinNode();if(isEqual(loc, dest.digit)vector rstep_v;cout Source: endl;cout src endl;PrintSteps(loc, rstep_v);cout Successful! endl;cout Using (clock() - start) / CLOCKS_PER_SEC seconds. endl;break;elseProcessNode(loc);return 0; 程序运行效果图28316475(初始状态)123804765(结束状态)F:CODE(C + + )A 星篇法kDe bu gA.I ni个人实验小结A*算法是一种有序搜索算法,其特点在于对估价函数的定义上。对于一般的 有序搜索,总是选择f值最小的节点作为扩展节点。通过本实验,我熟悉启发 式搜索的定义、估价函数和算法过程,并利用A*算法求解了 8数码难题,理解 了求解流程和搜索顺序。实验过程中巩固了所学的知识,通过实验也提高了自己 的编程和思维能力,收获很多。

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!