ImageVerifierCode 换一换
格式:DOCX , 页数:13 ,大小:230.35KB ,
资源ID:17407580      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/17407580.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(八数码问题C语言A星算法详细实验报告含代码文档格式.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

八数码问题C语言A星算法详细实验报告含代码文档格式.docx

1、(n)是n到目标的最短路经的启发值。由于这个f(n)其实是无法预先知道的,所以实际上使用的是下面的估价函数:f(n) = g(n) + h(n) 其中g(n)是从初始结点到节点n的实际代价,h(n)是从结点n到目标结点的最佳路径的估计代价。在这里主要是h(n)体现了搜索的启发信息,因为g(n)是已知的。用f(n)作为f(n)的近似,也就是用g(n)代替g(n),h(n)代替h(n)。这样必须满足两个条件:(1)g(n)=g(n)(大多数情况下都是满足的,可以不用考虑),且f必须保持单调递增。(2)h必须小于等于实际的从当前节点到达目标节点的最小耗费h(n)=h第二点特别的重要。可以证明应用这样

2、的估价函数是可以找到最短路径的。3.A*算法的步骤A*算法基本上与广度优先算法相同,但是在扩展出一个结点后,要计算它的估价函数,并根据估价函数对待扩展的结点排序,从而保证每次扩展的结点都是估价函数最小的结点。A*算法的步骤如下:1)建立一个队列,计算初始结点的估价函数f,并将初始结点入队,设置队列头和尾指针。2)取出队列头(队列头指针所指)的结点,如果该结点是目标结点,则输出路径,程序结束。否则对结点进行扩展。3)检查扩展出的新结点是否与队列中的结点重复,若与不能再扩展的结点重复(位于队列头指针之前),则将它抛弃;若新结点与待扩展的结点重复(位于队列头指针之后),则比较两个结点的估价函数中g的

3、大小,保留较小g值的结点。跳至第五步。4)如果扩展出的新结点与队列中的结点不重复,则按照它的估价函数f大小将它插入队列中的头结点后待扩展结点的适当位置,使它们按从小到大的顺序排列,最后更新队列尾指针。5)如果队列头的结点还可以扩展,直接返回第二步。否则将队列头指针指向下一结点,再返回第二步。四、程序框图五、实验结果及分析输入初始状态:2 8 3 目标状态: 1 2 3 1 6 4 8 0 4 7 0 5 7 6 5 运行结果屏幕打印OPEN表与CLOSE表:OPENCLOSE1 2 3 4 2 3 4 5 60 12 3 4 6 70 1 52 3 4 6 8 90 1 5 72 3 4 8

4、9 100 1 5 7 62 3 4 8 11 12 13 0 1 5 7 6 92 3 4 8 12 13 14 150 1 5 7 6 9 113 4 8 12 13 14 15 16 170 1 5 7 6 9 11 24 8 12 13 14 15 16 17 18 190 1 5 7 6 9 11 2 34 8 12 13 14 15 16 17 19 200 1 5 7 6 9 11 2 3 188 12 13 14 15 16 17 19 21 220 1 5 7 6 9 11 2 3 18 412 13 14 15 16 17 19 21 22 230 1 5 7 6 9 11

5、 2 3 18 4 812 13 14 15 16 17 19 21 22 24 250 1 5 7 6 9 11 2 3 18 4 8 2312 13 14 15 16 17 19 21 22 24 260 1 5 7 6 9 11 2 3 18 4 8 23 24发现26为目标节点072 8 31 0 47 6 5搜索树: 六、结论对于八数码问题,BFS算法最慢,A*算法较快。八数码问题的一个状态实际上是09的一个排列,对于任意给定的初始状态和目标,不一定有解,也就是说从初始状态不一定能到达目标状态。因为排列有奇排列和偶排列两类,从奇排列不能转化成偶排列。如果一个数字08的随机排列8715

6、26340,用F(X)表示数字X前面比它小的数的个数,全部数字的F(X)之和为Y=(F(X),如果Y为奇数则称原数字的排列是奇排列,如果Y为偶数则称原数字的排列是偶排列。因此,可以在运行程序前检查初始状态和目标状态的排序的奇偶行是否相同,相同则问题可解,应当能搜索到路径。否则无解。七、源程序及注释#include ctimevectorusing namespace std;const int ROW = 3;const int COL = 3;const int MAXDISTANCE = 10000;const int MAXNUM = 10000;int abs(int a)if (a0

7、) return a;else return -a;typedef struct _Nodeint digitROWCOL;int dist; / 距离 int dep; / 深度int index; / 索引值 Node;Node src, dest;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

8、digitCOL) /判断节点是否与索引值指向的节点相同 ROW; i+) for (int j = 0; j COL; j+) if (node_vindex.digitij != digitij) ostream& operator(ostream& os, Node& node) j+) os node.digitij ; endl;return os;void PrintSteps(int index, vector= 0; i-) cout Step rstep_v.size() - i endl rstep_vi void Swap(int& a, int& b) /交换 int

9、t;t = a;a = b;b = t;void Assign(Node& node, int index) /获取节点 node.digitij = node_vindex.digitij;int GetMinNode() /获取启发值最小的节点 int dist = MAXNUM;int loc; / the location of minimize node if (node_vi.dist = MAXNUM) continue; else if (node_vi.dist + node_vi.dep) dist) loc = i; dist = node_vi.dist + node_

10、vi.dep;return loc;bool isExpandable(Node& node) /判断是否可扩展 if (isEqual(i, node.digit)int Distance(Node& node, int digitCOL) /计算距离 int distance = 0;bool flag = false;for(int i = 0; i+) j+) for (int k = 0; k k+) for (int l = 0; l l+) if (node.digitij = digitkl) distance += abs(i - k) + abs(j - l); flag

11、= true; break; else flag = false; if (flag)return distance;int MinDistance(int a, int b) /二者取小 return (a 0) Swap(node_up.digitxy, node_up.digitx - 1y); if (isExpandable(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;

12、 node_v.push_back(node_up);Node node_down; /下移操作Assign(node_down, index);int dist_down = MAXDISTANCE;if (x Swap(node_left.digitxy, node_left.digitxy - 1); if (isExpandable(node_left) dist_left = Distance(node_left, dest.digit); node_left.index = index; node_left.dist = dist_left; node_left.dep = nod

13、e_vindex.dep + 1; node_v.push_back(node_left);Node node_right; /右移操作Assign(node_right, index);int dist_right = MAXDISTANCE;if (y Swap(node_right.digitxy, node_right.digitxy + 1); if (isExpandable(node_right) dist_right = Distance(node_right, dest.digit); node_right.index = index; node_right.dist = d

14、ist_right; node_right.dep = node_vindex.dep + 1; node_v.push_back(node_right);node_vindex.dist = MAXNUM;int main() int number;cout number; src.digitij = number;src.index = 0;src.dep = 1;输入目标状态for (int m = 0; m m+) for (int n = 0; n n+) dest.digitmn = number;node_v.push_back(src);while (1) if (isEmptyOfOPEN() 找不到解! return -1; else int loc; / the location of the minimize node loc = GetMinNode(); if(isEqual(loc, dest.digit) vector rstep_v;初始状态: src PrintSteps(loc, rstep_v);成功! ProcessNode(loc);return 0;如有侵权请联系告知删除,感谢你们的配合!

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1