贪心算法Tsp实习报告1
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
浙江农林大学信息工程学院课程实习报告
课程名称:数据结构实习
班级:电信****班
题目: TSP问题的贪心算法
组长: ******* 成员: ******* 指导教师: *******
2014年6月17 日
目录
1.课程实习目的 (1)
1.1贪心算法实习的目的 (1)
1.2TSP问题的解决及贪心算法的应用 (1)
1.3贪心算法的概念 (1)
2.课程实习题目描述和要求 (1)
2.1TSP问题介绍 (1)
2.2贪心算法的特性 (2)
2.2.1贪心算法的特性: (2)
2.2.2贪心算法的缺陷 (2)
2.3关于贪心算法的备注 (2)
3.课程实习报告内容 (2)
3.1了解并掌握贪心算法 (2)
3.2设计内容 (3)
3.2.1问题描述 (3)
3.2.2设计思想 (3)
3.3需求分析 (3)
3.3.1程序的功能: (3)
3.3.2输入输出的要求 (4)
3.4贪心算法解决TSP问题的流程图 (4)
3.5贪心算法解决TSP问题的步骤 (5)
4.总结 (5)
5.任务分配 (5)
1.课程实习目的
1.1贪心算法实习的目的
此次实习通过贪心算法来解决TSP问题。假设有n个城市,任意两个城市之间都有路径相通,并设第i个城市与第j个城市之间的距离为Dij,求从某个城市出发经过所有城市并且只经过一次又回到原点的都短距离。首先,本文运用Visual C++集成开发环境将贪心算法编程实现,并解决TSP问题。然后通过改变各个参数的值来观察计算结果,接着对运算结果的进行对比分析,从而验证各个参数对贪心算法的影响。
1.2TSP问题的解决及贪心算法的应用
旅行商问题(Traveling Salesman Problem, TSP),是一个著名的组合优化问题,该类问题具有非常广泛的运用背景。如物流的调度问题、数控机床上的最优钻孔路线的选取、电路板的焊接都属于旅行商问题。因此旅行商问题受到了各方面的关注,有效解决TSP问题在计算理论和实际应用上都有很高的价值。目前解决TSP的主要方法有贪心算法、遗传算法、模拟退火算法、蚁群算法、启发式搜索法、Hopfield神经网络算、二叉树描述算法。此次实习主要介绍了应用贪心算法来解决TSP问题。
1.3贪心算法的概念
贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的仅是在某种意义上的局部最优解。贪心算法不是对所有问题都能得到整体最优解,但对范围相当广泛的许多问题他能产生整体最优解或者是整体最优解的近似解。
为了解决问题,需要寻找一个构成解的候选对象集合,它可以优化目标函数,贪心算法一步一步的进行。起初,算法选出的候选对象的集合为空。接下来的每一步中,根据选择函数,算法从剩余候选对象中选出最有希望构成解的对象。如果集合中加上该对象后不可行,那么该对象就被丢弃并不再考虑;否则就加到集合里。每一次都扩充集合,并检查该集合是否构成解。如果贪心算法正确工作,那么找到的第一个解通常是最优的。
2.课程实习题目描述和要求
2.1TSP问题介绍
TSP问题,也称旅行商问题。已知n个城市之间的相互距离,现有一个推销员必须遍访这n个城市,并且每个城市只能访问一次,最后又必须返回出发城市。如何安排他的访问顺序,可使其旅行的总长度最短。用图论的术语来说,假设有一个图g=(v , e),其中v是顶点集,e是边集,设d=d ij是由顶点i和顶点j之间距离所组成的距离矩阵,旅行商问题就是要求出一条通过所有顶点且每个顶点只通过一次的具有最短距离的回路。这个问题可分为对称旅行商问题( d ij = d ji )任意(i , j=1,2,3,···,n)和非对称旅行商问题(d ij≠d ji)任意i , j=(1,2,3,···,n)。城市v={v1,v2,v3,···,v n的一个访问顺序为t(t1,t2,t3,···,ti,···,tn),其中ti∈v(i=1,2,3,···,n),
且记t(n+1)=t1,则旅行商问题的数学模型为:min =σd(t(i),t(i+1))(i=0,···,9)。
2.2贪心算法的特性
2.2.1贪心算法的特性:
(1)有一个以最优方式来解决的问题。为了构造问题的解决方案,有一个候选的对象的集合:比如不同面值的硬币。
(2)随着算法的进行,将积累起其它两个集合:一个包含已经被考虑过并被选出的候选对象,另一个包含已经被考虑过但被丢弃的候选对象。
(3)有一个函数来检查一个候选对象的集合是否提供了问题的解答。该函数不考虑此时的解决方法是否最优。
(4)还有一个函数检查是否一个候选对象的集合是可行的,也即是否可能往该集合上添加更多的候选对象以获得一个解。和上一个函数一样,此时不考虑解决方法的最优性。
(5)选择函数可以指出哪一个剩余的候选对象最有希望构成问题的解。
(6)最后,目标函数给出解的值。
2.2.2贪心算法的缺陷
贪心算法(又称贪心算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,它所做出的仅是在某种意义上的局部最优解。贪心算法不是对所有问题都能得到整体最优解,但对范围相当广泛的许多问题他能产生整体最优解或者是整体最优解的近似解。
2.3关于贪心算法
贪心算法当然也有正确的时候。求最小生成树的Prim算法和Kruskal算法都是漂亮的贪心算法。
贪心法的应用算法有Dijkstra的单源最短路径和Chvatal的贪心集合覆盖启发式所以需要说明的是,贪心算法可以与随机化算法一起使用,具体的例子就不再多举了。(因为这一类算法普及性不高,而且技术含量是非常高的,需要通过一些反例确定随机的对象是什么,随机程度如何,但也是不能保证完全正确,只能是极大的几率正确)。
3.课程实习报告内容
3.1了解并掌握贪心算法
贪心算法(Greedy algorithm)是一种对某些求最优解问题的更简单、更迅速的设计技术。用贪心法设计算法的特点是一步一步地进行,常以当前情况为基础根据某个优化测度作最优选择,而不考虑各种可能的整体情况,它省去了为找最优解要穷尽所有可能而必须耗费的大量时间,它采用自顶向下,以迭代的方法做出相继的贪心选择,每做一次贪心选择就将