tsp问题报告算法分析与设计.docx

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
TSP问题 一、问题描述 所谓TSP问题是指旅行商要去n个城市推销商品,其中每个城市 到达且仅到达一次,并且要求所走的路程最短(该问题又称货郎担问 题、邮递员问题、售货员问题等)。TSP问题最容易想到、也肯定 能得到最优解的算法是穷举法,即考察所有可能的行走线路,从中选 出最佳的一条。 二、解题思路 基本思路 对于图G=(V,E),从起点出发,其余点作为路径集合,然后列出路 径集合中各个点作为子路径起点,其余点作为路径集合的情况,从中 选取路径长度最短的情况,再对路径集合迭代计算,直到路径集合为 空的时候,这时最短路径的情况即是该点到原点的距离,路径集合是 空集{},此时己触碰临界条件,可以不断回溯之前的迭代,进而解决 此问题。 最优值函数和边界条件 d(kf ) = Cki ld(i,W) = min{cik + d(k V - {k}) } (k G V) 第二行是最优值函数。从i到集合v的最优路径是以v中某一 点作为子路径起点,其余点作为路径集合的路径的长度加上从k至ij i 的距离的最优值。 第一行是边界条件。当子路径的路径集合是空集时,最优子问题 的解,木题来说也就是子路径的最短路径就是从子路径的起点到原来 起点的距离。 标记函数 标记函数同时也是算法的核心函数,完全按照递推公式的思想, 使用迭代的方式。distance是第一个核心函数,主要负责路径的输出; distance 1是第二个核心函数,主要负责寻求子集合的最短路径并计算 长度。第一核心函数中调用了第二核心函数,第一核心函数只负路 径的输出,在将问题细化深入的过程中,将真正的路径寻找和计算交 给第二核心函数。 标记函数的解读: (l)distance double distance(int a^int b[]^int double d[][NUM]4int start) a:子问题起点 b[]:字问题路径集合 d[][]:距离矩阵(最开始创建的,所有调用函数过程中,都使用的这个,没有 更改,只有读取) start:原问题起点(达到临界条件时,找到路径长度) 〃边界条件 if(c==0){ coutstart; return d[a][start]; } 〃非临界条件时候,构建所有路径集合的,起点和对应的路径集合,在迭 代的时候会使用到 else{ for(i=0;ic;i++){ point[i]=b[i]; k=0; for(j=0;jc;j++){ e[i][k]=b[j]; /*节点方阵,冗余的*/ k++; } } } mindistance=distancel(point[k],e[k],c-:l,d,start) +d[a] [point[k] ];〃假定下一层的最短路径就是p[6以及其对应的路径矩阵e[k] for(i=0;ic-l;i++) //比较出下一层真正的最短路径 if (mindis tan ce(distancel(po int[ i+l] ,e[i+l] start)+d[ a][point[i+l]])) { k=i+l; mindistance二distancel(point[k],e[k]‘c-l’d,start)+d[a][poin t[k]]; } coutpoint[k],,-; r eturn dis tan ce(po int[ k],e[k], c-ld start)+d[a] [point[k]]; } (2)distancel double distancel(int a’int b[]^int c^double d[][NUMj^int start) 〃边界条件 if(c==0){ return d[a][start]; } 〃非边界条件 else{ for(i=0;ic;i++){ point[i]=b[i]; k=0; for(j=0;jc;j++){ e[i][k]=b[j]; k++; } } } //拆分该点到达起点所需经过的集合该点的下一点到达起点所需经过的集合 mindistance=distancel(point[0],e[0]tart)+d[a][point[ 0]]; for(i=0;ic-l;i++) if (mindis tan ce(dis tancel (point [i+1] ,e[i+:L]C?:L,d, start) +d[ a][point[i+l]])) mindistance=distancel(point[i+l],e[i+l] ‘c-l。start)+d[a][ point[i+l]]; return mindistance; 〃求最小值 } } 时间复杂度分析 整体的时间复朵度是O (2M)。时间集合中共有n个点,每个点 所对应的路径集合中有n-1个点,产生的

文档评论(0)

xiaozu + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档