动态规划旅行售货员问题.docVIP

  1. 1、本文档共14页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
动态规划旅行售货员问题

xxxxxxxx大学 解决旅行售货商问题xxxxxxxxxxxxx 院 系: xxxxxxxxxxxxxx 学生姓名: xxxxxx 学 号: xxxxxxxxx 指导教师: xxxxxx 2015年月5日 摘要: 旅行商问题(TSP问题)时是指旅行家要旅行n个城市然后回到出发城市,要求各个城市经历且仅经历一次,并要求所走的路程最短。该问题又称为货郎担问题、邮递员问题、售货员问题,是图问题中最广为人知的问题。 动态规划 ( dynamic programming )算法 是解决 多阶段决策过程最优化问题 的一种常用方法,难度比较大,技巧性也很强。利用动态规划算法,可以优雅而高效地解决很多贪婪算法或分治算法不能解决的问题。 本次课程设计运用动态规划解决旅行售货员问题,动态规划的基本思想是:把求解的问题分成许多若干阶段或许多子问题,然后按顺序求解各子问题。前一子问题的解,为后一子问题的求解提供了有用的信息,在求解任一子问题时列出各种可能的局部解,通过决策保留那些有可能达到最优的局部解,丢弃其他局部解。依次解决各子问题,最后一个子问题就是初始问题的解。通过图的关系矩阵来表示个城市之间的关系,二维数组表示顶点之间的距离关系,对子问题进行求解比较,最后得出所求结果。 关键字:旅行商问题 动态规划法 图 矩阵 目录 第一章 绪论 1.1算法介绍 1.2算法应用 第二章 动态规划理论知识 2.1动态规划的基本思想 2.2动态规划设计步骤 第三章 旅行售货员问题 3.1问题描述:旅行售货员问题 3.2算法设计内容 3.3算法分析 3.4流程图 第四章 物流配送网络 第五章 结论 第一章 绪论 1.1算法介绍1.2算法应用第二章i出发,令d(i,V’)表示从顶点i出发经过V’中各个顶点一次且仅一次,最后回到出发点i的最短路径的长度,开始时,V’=V-{i},于是,旅行商问题的动态规划函数为: d(i,V’) = min{cik + d(k,V’-{k})} (k∈V’) 1) d(k,{}) = cki (k ≠ i) 2) 简单来说,就是用递归表达:从出发点0到1号点,假设1是第一个,则剩下的路程就是从1经过剩下的点最后回到0点的最短路径. 所以当V’为空的时候, d(k,{}) = cki (k ≠ i), 找的是最后一个点到0点的距离.递归求解1之后,再继续求V’之中剩下的点,最后找出min. 如果按照这个思想直接做,对于每一个i都要递归剩下的V中所有的点,所以这样的时间复杂度就近似于N!,其中有很多重复的工作. 可以从小的集合到大的集合算,并存入一个二维数组,这样当加入一个节点时,就可以用到之前的结果,如四个点的情况: 邻接矩阵: node 0 1 2 3 0 ? 5 3 2 1 5 ? 7 9 2 3 7 ? 12 3 2 9 12 ? 动态填表: 表中元素代表第i个节点经过V集合中的点最后到0点的最短值.如果有多个值,取其中最小的一个. i\Vj 0 1 2 3 1,2(取min) 1,3(取min) 2,3(取min) 1,2,3(取min) 0 ? ? ? ? ? ? ? c[0][i]+d[i][v’]=21 1 5 ? 10 11 ? ? {c[1][2]+ d[2][{3}]=21, c[1][3]+ d[3][{2}]=24} ? 2 3 12 ? 14 ? {c[2][1]+ d[1][{3}]=18, c[2][3]+ d[3][{1}]=26} ? ? 3 2 14 15 ? {c[3][1]+ d[1][{2}]=19, c[3][2]+ d[2][{1}]=24} ? ? ? 这样一共循环(2^(N-1)-1)*(N-1)次,就把时间复杂度缩小到O(N*2N )的级别. 核心伪代码如下: { for (i =1;in;i++) d[i][0]=c[i][0]; for( j=1;j2^(N-1)-1;j++) for(i=1 ; in ;i++) { if(子集Vj中不包含i){ 对Vj中的每个元素k,计算d[i][Vj] = min{c[i][k] + d[k][{Vj-k}] | 每一个k∈Vj}; } } 对V[2^(n-1)-1]中的每个元素k,计算: d[0][2^(n-1)-1] = min{c[0][k] + d[k][2^(n-1

文档评论(0)

li3543jian + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档