数据结构常见问题:12单元30 旅行商问题.docxVIP

数据结构常见问题:12单元30 旅行商问题.docx

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
《数据结构》课程常见问题 单元30旅行商问题i.旅行商问题的几种求解算法比拟? 解析: 动态规划法解TSP问题我们将具有明显的阶段划分和状态转移方程的规划称为动态规划,这种动态规划是在研究多阶段决策问题 时推导出来的,具有严格的数学形式,适合用于理论上的分析.在实际应用中,许多问题的阶段划分并不明显, 这时如果刻意地划分阶段法反而麻烦?一般来说,只要该问题可以划分成规模更小的子问题,并且原问题的最 优解中包含了子问题的最优解(即满足最优子化原理),那么可以考虑用动态规划解决.所以动态规划的实质是 分治思想和解决冗余,因止匕,动态规划是一种将问题实例分解为更小的,相似的子问题,并存储子问题的解而 防止计算重复的子问题,以解决最优化问题的算法策略. 旅行商问题(TSP问题)其实就是一个最优化问题,这类问题会有多种可能的解,每个解都有一个值,而动态规 划找出其中最优(最大或最小)值的解.假设存在假设干个取最优值的解的话,它只取其中的一个.在求解过程中,该 方法也是通过求解局部子问题的解到达全局最优解,但与分治法和贪心法不同的是,动态规划允许这些子问 题不独立,(亦即各子问题可包含公共的子子问题)也允许其通过自身子问题的解作出选择,该方法对每一个 子问题只解一次,并将结果保存起来,防止每次碰到时都要重复计算. 关于旅行商的问题,状态变量是gk(i,S),表示从0出发经过k个城市到达i的最短距离,S为包含k个城市的可 能集合,动态规划的递推关系为: gk(i,S)=min[gk-l(j,S\{j})+dji] j 属于 S,dji 表示 j-i 的距离. 或者我们可以用: f(S,v)表示从v出发,经过S中每个城市一次且一次,最短的路径. f(S,v)=min { f(S -{u} ,u)+dist(v,u) }u in S f(V,l)即为所求.分支限界法解TSP问题 旅行商问题的解空间是一个排列树,与在子集树中进行最大收益和最小耗费分枝定界搜 索类似,使用一个优先队列,队列中的每个元素中都包含到达根的路径. 假设我们要寻找的是最小耗费的旅行路径,那可以使用最小耗费分枝定界法.在实现 过程中,使用一个最小优先队列来记录活节点,队列中每个节点的类型为MinHeapNod e.每个节点包括如下区域:x(从1到n的整数排列,其中x [ 0 ] = 1 ),s( 一个整数,使得从排列树的根节点到当前节点的路径定义了旅行路径的前缀x[0:s],而剩余待访问的节点是x [ s + 1 : n - 1 J),c c(旅行路径前缀,即解空间树中从根 节点到当前节点的耗费),1 c o s t(该节点子树中任意叶节点中的最小耗费),r c o s t(从顶点x [ s : n - 1 ]出发的所有边的最小耗费之和).当类型为MinH eapNode(T )的数据被转换成为类型T时,其结果即为Icost的值.分枝定界 算法的代码见程序. 程序首先生成一个容量为1 0 0 0的最小堆,用来表示活节点的最小优先队列.活节点按其Icost值从最小堆 中取出.接下来,计算有向图中从每个顶点出发的边中耗费最小的边所具有的耗费MinOu t.如果某些顶点 没有出边,那么有向图中没有旅行路径,搜索终止.如果所有的顶点都有出边,那么可以启动最小耗费分枝定界搜 索.根的孩子(图16-5的节点B)作为第一个E-节点,在此节点上,所生成的旅行路径前缀只有一个顶点1,因 此s=0, x[0]=l,是剩余的顶点(即顶点2,3 n ).旅行路径前缀1的开销为。,即c c = 0,并且,r c ost=n i=lM inOut .在程序中,bestc给出了当前能找到的最少的耗费值.初始时,由于没有找到任何旅行路径, 因此bestc的值被设为N o E d g e. 程序旅行商问题的最小耗费分枝定界算法template T Adjacency WDigraph: :BBTSP(int v[]){//旅行商问题的最小耗费分枝定界算法 //定义一个最多可容纳1 000个活节点的最小堆MinHeapH(1000); T *MinOut = new T [n+1];//计算MinOut =离开顶点i的最小耗费边的耗费 T MinSum = 0; //离开顶点i的最小耗费边的数目for (int i = 1; i = n; i++) { T Min = NoEdge;for (int j = 1; j = n; j++) if(a|j] != NoEdge (a[j] Min || Min == NoEdge)) Min = a[j];if (Min == NoEdge) return NoEdge; // 此路不通 MinOut = Min; MinSum += Min; }//把E-节点初

文档评论(0)

艺心论文信息咨询 + 关注
官方认证
文档贡献者

该用户很懒,什么也没介绍

认证主体成都艺心风尚电子商务有限公司
IP属地四川
统一社会信用代码/组织机构代码
91510100MA6CA54M2R

1亿VIP精品文档

相关文档