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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

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

A星算法八数码问题和SA算法模拟退火算法旅行商问题Word文档下载推荐.docx

1、 结点在closed表中,将closed表中结点加入Bestnode后继结点链,若此结点g值小于closed表中结点g值,closed表中结点改变parent指针,closed表中结点重新加入open表中,并删除此点 open表和closed表中均无此点,将此点加入Bestnode后继结点链,并按一定规则的加入到open表中【问题描述】 在一个3*3的方棋盘上放着1,2,3,4,5,6,7,8八个数码,每个数码各占一格,且有一个空格。这些数码可以在棋盘上移动,其移动规则时:与空格相邻的数码放个可以移入空格。现在的问题是:对于指定的初始棋局和目标棋局,给出数码的移动序列。【核心代码】while(

2、!isEmpty(open) /从open表中拿出f值最小的元素,并将拿出的元素放入closed表中 popN (open , tmpNode); addN (closed , tmpNode); outputS (tmpNode); if(HValue(tmpNode) = 0) success= true;/目标结点 SucceedL(tmpNode , succeed);/后继存入succeed /判断后继结点 while(!isEmpty(succeed) popN (succeed, tmpLNode); if(inLink(tmpLNode , open , tmpChartNod

3、e , thePreNode) else if(inLink(tmpLNode , closed , tmpChartNode , thePreNode) else addSucceedN(tmpNode , tmpLNode); addAscNode(open , tmpLNode); if(success) outputBR(tmpNode);/打印最优路径【实验结果】1.启发式函数h(n)采用不在位奖牌数时,所得结果:2.启发式函数h(n)采用曼哈顿距离时的结果对比上述两种情况,因此实验中,不在位奖牌数为4,曼哈顿距离为1+2+1+1=5.所以但启发式函数采用曼哈顿距离时,其包含的启发信

4、息量大,搜索效率高。体现在上实验上便是,加入open表的状态数少1.但最终最优路径一致。【实验思考】八数码的可解问题如上图,此种情况下,八数码问题是无解的。通过查阅资料,了解到八数码解的问题可以通过逆序数的奇偶性来判断。因为八数码问题在空白移动过程中,数码的逆序数不改变。左右移动,数码序列不变。上下移动,数码序列中某个数字则移动了两位,整个序列的奇偶性不变。问题的实质就是:如果是N*N的数码盘的话,左右移动,数码序列不变;上下移动则数码序列变动N-1位。若N为奇数则在变动过程中其逆序数的奇偶性不会改变。因八数码问题N=3,为奇数故可通过判断当前状态S的逆序数以及目标状态SD的数字序列的逆序数的

5、奇偶性是否相同来判断该问题是否可解。 模拟退火算法作为局部搜索算法的一种扩展,是根据复杂组合优化问题与固体的退火过程之间的相似之处,从而在它们之间建立联系而提出来的。它是一种典型的概率模拟算法,其基本思想时在一个相当大的空间内搜索最优解,而每次只搜索与自己临近的状态,并按照Metropolis准则随机地接受一些劣解,及指标函数值大的解,当温度比较高时,接受劣解的概率比较大,在初始温度下,几乎以100%的概率接受劣解。随着温度的下降,接受劣解的概率逐渐减小,直到当温度趋于0时,接受劣解的概率也趋于0。这样将有利于算法从局部最优解中跳出,求得问题的全局最优解。 选择初始状态S(初始解)、初始温度、

6、降温次数 生成S的邻域状态S,并计算C(S)-C(S) 按接收概率置换S 重复第二步直至停机条件 假设有一个旅行商人要拜访n个城市,他必须选择所要走的路径,路经的限制是每个城市只能拜访一次,而且最后要回到原来出发的城市。路径的选择目标是要求得的路径路程为所有路径之中的最小值。while(true) for(i=0; iIN_LOOP; i+)newPath = getnext(curPath);/交换任意两点,产生新路径delta = newPath.length - curPath.length;if(delta 0) /更新长度 curPath = newPath; P_L = 0; P_

7、F = 0;Else p = (double)(1.0*rand()/(RAND_MAX+1.0); if(exp(delta/T) p) curPath = newPath; P_L +;if(P_L LIMIT) P_F +; break;/End for if(curPath.length FINL_LOOP | Tnext = NULL;/判断链表是否为空bool isEmpty(PNode Head) if(Head-next = NULL) return true; else return false;/从链表中拿出一个数据void popN(PNode &Head , PNode

8、 &FNode) if(isEmpty(Head) FNode = NULL; return; FNode = Head-next;next = Head-next- FNode-/向结点的最终后继结点链表中添加新的子结点void addSucceedN(PNode &Head , PNode newData) PSPLink newNode = (PSPLink)malloc(sizeof(SPLink); newNode-pointData = newData;child;child = newNode;/释放状态图中存放结点后继结点地址的空间void freeSpringLink(PSP

9、Link & PSPLink tmm; while(Head != NULL) tmm = Head; Head = Head- free(tmm);/释放open表与closed表中的资源void freeLink(PNode & PNode tmn; tmn = Head; Head = Head- free(tmn); /首先释放存放结点后继结点地址的空间 freeSpringLink(Head-child); tmn = Head; free(tmn);/向普通链表中添加一个结点void addN(PNode &newNode)next = newNode;/向非递减排列的链表中添加一

10、个结点void addAscNode(PNode & PNode P; PNode Q; P = Head- Q = Head; while(P != NULL & P-fvalue /上面判断好位置之后,下面就是简单的插入了next = Q- Q-/计算结点额h值int HValue(PNode theNode) int num = 0; /*for(int i = 0 ; i 3 ; i+) for(int j = 0 ; j dataij != targetij) num+; */ for(int i = 0;i 3;i+) for(int j=0;jj+) for(int k=0;kk

11、+) for(int l=0;ldataij = targetkl) num+=abs(i-k)+abs(j-l); return num;/计算结点的f,g,h值void computeAllValue(PNode &theNode , PNode parentNode) if(parentNode = NULL) theNode-gvalue = 0;gvalue = parentNode-gvalue + 1; theNode-hvalue = HValue(theNode);fvalue = theNode-gvalue + theNode-hvalue;/初始化函数,进行算法初始条件

12、的设置void initial() /初始化open以及closed表 initLink(open); initLink(closed); /初始化起始结点,令初始结点的父节点为空结点 PNode NULLNode = NULL; PNode Start = (PNode)malloc(sizeof(NNode); for(int i = 0 ; Start-dataij = starttij; Start-parent = NULL;child = NULL; computeAllValue(Start , NULLNode); /起始结点进入open表 addAscNode(open ,

13、Start);/将B节点的状态赋值给A结点void statusAEB(PNode &ANode , PNode BNode) ANode-dataij = BNode-dataij;/两个结点是否有相同的状态bool hasSameStatus(PNode ANode , PNode BNode) if(ANode-= BNode-dataij) return false; return true;/结点与其祖先结点是否有相同的状态bool hasAnceSameStatus(PNode OrigiNode , PNode AnceNode) while(AnceNode ! if(hasS

14、ameStatus(OrigiNode , AnceNode) return true; AnceNode = AnceNode-parent; return false;/取得方格中空的格子的位置void getPosition(PNode theNode , int &row , int &col)dataij = 0) row = i; col = j; return;/交换两个数字的值void changeAB(int &A , int &B) int C; C = B; B = A; A = C;/检查相应的状态是否在某一个链表中bool inLink(PNode spciNode

15、, PNode theLink , PNode &theNodeLink , PNode &preNode) preNode = theLink; theLink = theLink- while(theLink ! if(hasSameStatus(spciNode , theLink) theNodeLink = theLink; preNode = theLink; theLink = theLink-/产生结点的后继结点(与祖先状态不同)链表void SucceedL(PNode theNode , PNode &succeed) int row; int col; getPositi

16、on(theNode , row , col); /空的格子右边的格子向左移动 if(col != 2) PNode rlNewNode = (PNode)malloc(sizeof(NNode); statusAEB(rlNewNode , theNode); changeAB(rlNewNode-datarowcol , rlNewNode-datarowcol + 1); if(hasAnceSameStatus(rlNewNode , theNode-parent) free(rlNewNode);/与父辈相同,丢弃本结点 else rlNewNode-parent = theNode

17、; computeAllValue(rlNewNode , theNode); /将本结点加入后继结点链表 addN(succeed , rlNewNode); /空的格子左边的格子向右移动= 0) PNode lrNewNode = (PNode)malloc(sizeof(NNode); statusAEB(lrNewNode , theNode); changeAB(lrNewNode-datarowcol , lrNewNode-datarowcol - 1); if(hasAnceSameStatus(lrNewNode , theNode- free(lrNewNode); lrNewNode- computeAllValue(lrNewNode , theNode); addN(succeed , lrNewNode); /空的格子上边的格子向下移动 if(row ! PNode udNewNode = (PNode)malloc(sizeof(NNode); statusAEB(udNewNode , theNode); changeAB(udNewNode-datarowcol , udNewNode-datarow - 1col); if(hasAnceSameStatus(udNewNode , theNode- free(udNewNode);

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

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