收藏 分享(赏)

旅行者问题.doc

上传人:wspkg9802 文档编号:7895735 上传时间:2019-05-29 格式:DOC 页数:5 大小:15.58KB
下载 相关 举报
旅行者问题.doc_第1页
第1页 / 共5页
旅行者问题.doc_第2页
第2页 / 共5页
旅行者问题.doc_第3页
第3页 / 共5页
旅行者问题.doc_第4页
第4页 / 共5页
旅行者问题.doc_第5页
第5页 / 共5页
亲,该文档总共5页,全部预览完了,如果喜欢就下载吧!
资源描述

1、1.问题定义TSP 问题(旅行商问题)是指旅行家要旅行 n 个城市,要求各个城市经历且仅经历一次然后回到出发城市,并要求所走的路程最短。 假设现在有四个城市,0,1,2,3,他们之间的代价如图一,可以存成二维表的形式图一 现在要从城市 0 出发,最后又回到 0,期间 1,2,3 都必须并且只能经过一次,使代价最小。2.动态规划可行性设 s, s1, s2, , sp, s 是从 s 出发的一条路径长度最短的简单回路,假设从 s 到下一个城市 s1 已经求出,则问题转化为求从 s1 到 s 的最短路径,显然 s1, s2, , sp, s 一定构成一条从 s1 到 s 的最短路径,所以 TSP

2、问题是构成最优子结构性质的,用动态规划来求解也是合理的。3.推导动态规划方程假设从顶点 s 出发,令 d(i, V)表示从顶点 i 出发经过 V(是一个点的集合)中各个顶点一次且仅一次,最后回到出发点 s 的最短路径长度。推导:(分情况来讨论 )当 V为空集,那么 d(i, V),表示从 i 不经过任何点就回到 s 了,如上图的 城市 3-城市 0(0 为起点城市) 。此时 d(i, V)=Cis(就是 城市 i 到 城市 s 的距离) 、如果 V不为空,那么就是对子问题的最优求解。你必须在 V这个城市集合中,尝试每一个,并求出最优解。d(i, V)=minCik + d(k, V-k)注:C

3、ik 表示你选择的城市和城市 i 的距离, d(k, V-k)是一个子问题。综上所述,TSP 问题的动态规划方程就出来了: 4.实例分析现在对问题定义中的例子来说明 TSP 的求解过程。( 假设出发城市是 0 城市)我们要求的最终结果是 d(0,1,2,3),它表示,从城市 0 开始,经过1,2,3 之中的城市并且只有一次,求出最短路径.d(0,1,2,3) 是不能一下子求出来的,那么他的值是怎么得出的呢?看上图的第二层,第二层表明了 d(0,1,2,3)所需依赖的值。那么得出:d(0,1,2,3)=min C01+d(1,2,3)C02+d2,1,3C03+d3,1,2d(1,2,3),d(

4、2,1,3),d(3,1,2) 同样也不是一步就能求出来的,它们的解一样需要有依赖,就比如说 d(1,2,3)d(1,2,3)=minC12+d(2,3) C13+d(3,2)d(2,1,3),d(3,1,2)同样需要这么求。按照上面的思路,只有最后一层的,当当 V为空集时,Cis 的值才可以求,它的值是直接从这张表里求得的。5.编程思路将 d(i, V)转换成二维表,dij在程序中模拟填表的过程,主要要考虑到 j 这个参数的表示,它要代表一个集合,可以用二维数组来表示。6.源代码注:由于本人水平有限,并且主要在这里是体现思路,所以程序并不是很完善,代码质量也不高,很地方可以写得通用一些,所以

5、这里只是提供一个参考,程序的进一步完善,由读者自由发挥。#include #include int IsIncluded(int x,int array3)/x 是否包含在数组中 if(array0 != x) return 1; int Left(int k,int array3,int V83)/实现 V-k 的下标检索 int i = 0,index = 0,array_0_count = 0,array_1_count = 0,array_2_count = 0,array_3_count = 0; int V_0_count = 0,V_1_count = 0,V_2_count =

6、 0,V_3_count = 0; int temp3; for(i = 0; i 3; i+) tempi = arrayi; for(i = 0; i 3; i+) if(tempi = k) tempi = 0; /相当于去掉 k 这个城市 for(i = 0; i 3; i+) if(tempi = 0) array_0_count+; else if(tempi = 1) array_1_count+; else if(tempi = 2) array_2_count+; else array_3_count+; for(index = 0; index 8; index+) for

7、(i=0; i 3; i+) if(Vindexi = 0) V_0_count+; else if(Vindexi = 1) V_1_count+; else if(Vindexi = 2) V_2_count+; else V_3_count+; if(array_0_count = V_0_count) V_0_count = 0; V_1_count = 0; V_2_count = 0; V_3_count = 0; return 0; void TSP(int d48,int c44,int V83,int n) int i = 0,j = 0,k = 0; for(i = 1;

8、i n; i+)/V为空时,给赋值, di0 = ci0; for(j = 1; j 7; j+)/按列遍历不同集合,1,2,3,1,2,1,3. for(i = 1; i n; i+)/遍历城市 1,2 ,3 if( !IsIncluded(i,Vj) )/i 必须不在集合中,否则就属于经过两次,不符合题意 for(k = 0; k 3; k+)/分别试探集合中的每一点,取最小值 if(Vjk != 0) /end of for(i = 1; i n; i+)/遍历城市 1,2,3 /end of for(j = 1; j (int)pow(2,n)-1); j+) for(k = 0; k 3; k+)/分别试探下一步为集合中的任何一点,取最小值 if(V7k != 0) void main() int V83= 0,0,0, 0,0,1, 0,0,2, 0,0,3, 0,1,2, 0,1,3, 0,2,3, 1,2,3 ; int c44= 0,3,6,7, 5,0,2,3, 6,4,0,2, 3,7,5,0 ; int d48=0,i=0,j=0; for(i=0; i4; i+) for(j=0; j8; j+) dij=1000; /假设 1000 为无穷大 TSP(d,c,V,4); printf(“The least road is:%d/n“,d07);

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报