旅行商问题”的A算法实现
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
改原则是"抄f(x)值小的路走"; (2) 对其余子节点配上指向N的返回指针后放入OPEN表中,并对OPEN表按f(x)值升序排 序,转步2。 下面为A*算法的伪代码: AStar () {
Open = [起始节点]; Closed = []; while (Open表非空) { 从Open中取得一个节点X,并从OPEN表中删除; if (X是目标节点) { 求得路径PATH;返回路径PATH; } for (每一个X的子节点Y) { if (Y不在OPEN表和CLOSE表中) { 求Y的估价值; 并将Y插入OPEN表中; } //还没有排序 else if (Y在OPEN表中) { if (Y的估价值小于OPEN表的估价值) { 更新OPEN表中的估价值;
} else {
将Y插入OPEN表中; } } else //Y在CLOSE表中 { if (Y的估价值小于CLOSE表的估价值) { 更新CLOSE表中的估价值; 从CLOSE表中移出节点,并放入OPEN表中; } else { 将Y插入OPEN表中; } } }//end for
பைடு நூலகம்
将X节点插入CLOSE表中; 按照估价值将OPEN表中的节点排序; }//end while }//end func 三、测试用例 1、用两个城市测试,如下图:
经过运行后找到最佳路径如下图所示:
2、用四个城市测试,如下图:
经过运行后找到最佳路径如下图所示:
3、用五个城市测试,如下图:
经过运行后找到最佳路径如下图所示:
从以上三个例子我们可以看出,本程序正确无误。 四、 心得体会 1. 通过本实验,我深该地掌握了A*算法,弄清A算法与A*算法的区别与联系,弄清了启 发式算法较之盲目搜索算的优点。 2. 懂得算法不等于就能够写出算法对应的程序。算法是思想,要想把思想转化为程序, 不仅要求对算法能够深刻地理解,还要能够把算法抽象成程序能如表示的方法(如设计相 应的数据结构)。因此,实现算法,既是对算法理解加深的过程,又是提高程序设计能力 的过程。 五、源程序 本程序使用MFC7.0编写,项目名为TravelerField。所有源代码位于同文件夹的 TravelerField项目中。 ??
"旅行商问题"的A*算法实现
学号:040330624 姓名:李祥 班级:0403306班 日期:2007年1月15日 指导老师:徐敏
南京航空航天大学计算机科学与技术专业
一、 问题描述 货郎担(旅行商)问题:
设有n个城市,城市之间均有道路,一个旅行商从某城市出发,经过其余n-1个城市一 次且仅一次,最后回到出发的城市,他如何走才能使他所走的路程最短? 用A*算法实现,语言不限。 二、 算法 A*算法是基于估价函数f(x)的一种加权状态图启发式搜索算法。A*算法的核心是估价 函数f(n),它包括g(n)和h(n)两部分。g(n)是已经走过的代价,h(n)是n到目标的估计代 价。A算法限制其估价函数中的启发函数h(x)满足:对所有的节点x均有h(x)≤h*(x),其 中h*(x)是从节点x到目标节点的最小代价(若有多个目标节点则为其中最小的一个)。 A*算法的具体步骤如下: 步1 把附有f(S0)的初始节点S0放入OPEN表; 步2 若OPEN表为空,则搜索失败,退出。 步3 移出OPEN表中第一个节点N放入CLOSED表中,并冠以顺序编号n; 步4 若目标节点Sg=N,则搜索成功,结束。 步5 若N不可扩展,则转步2; 步6 扩展N,生成一组附有f(x)的子节点,对这组子节点作如下处理: (1) 考察是否有已在OPEN表或CLOSED表中存在的节点;若有则再考察其中有无N的先辈 节点,若有则删除之;对于其余节点,也删除之,但由于它们又被第二次生成,因而需考 虑是否修改已经存在于OPEN表或CLOSED表中的这些节点及其后裔的返回指针和f(x)值,修
??
??
??
用A*算法解"旅行商问题"
-1-