用动态规划法求解TSP问题

一、求解TSP问题
1、问题描述

  • TSP问题(担货郎问题,旅行商问题)是指旅行家要旅行n个城市,要求各个城市经历且仅经历一次然后回到出发城市,并要求所走的路程最短
  • 各个城市间的距离可以用代价矩阵来表示。
    在这里插入图片描述
    2、【应用】
    例如:校车怎样以最短的路线行走而接送到所有学生?报纸和牛奶的配送路线怎样最优?循环旅游怎样选取才能实现开支最少?公司视察子公司怎样出差更高效?
    3、【蛮力法求解】
    用蛮力法解决TSP问题,可以找出所有可能的旅行路线,即依次考察图中所有顶点的全排列,从中选取路径长度最短的简单回路。
    在这里插入图片描述
    在这里插入图片描述
    4、证明TSP问题满足最优性原理
    设s,s1,s2, …,sp,s是从s出发的一条路径长度最短的简单回路,假设从s到下一个城市s1已经求出,则问题转化为求从s1到s的最短路径,显然s1,s2,…,sp,s一定构成一条从s1到s的最短路径。
    如若不然,设s1,r1,r2,…,rq,s是一条从s1到s的最短路径且经过n-1个不同城市,则s,s1,r1,r2,…,rq,s将是一条从s出发的路径长度最短的简单回路且比s,s1,s2,…,sp,s要短,从而导致矛盾。所以,TSP问题满足最优性原理。
    5、动态规划法求解过程——示例
    在这里插入图片描述
    在这里插入图片描述6、动态规划求解问题的步骤
    (1)划分子问题—找到“状态”
    在这里插入图片描述
    (2)状态方程在这里插入图片描述
    (3)填表在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    7、算法设计
    (1)【数据结构设计】
    二维数组c[n][n]存放顶点之间的代价,n个顶点用0~n-1的数字编号
    一维数组V[2n-1]存放1~n-1个元素的所有子集
    二维数组dp[n][2n-1]存放递推结果,其中dp[i][j]表示从顶点i经过子集V[j]中的顶点一次且仅一次,最后回到出发点0的最短路径长度。
    (2)【动态规划法算法】
    算法——TSP问题
    1.for(i=1; i<n; i++) d[i][0]=c[i][0]; //初始化第0列
    2.for(j=1; j<2n-1-1; j++)
    for(i=1; i<n; i++) //依次进行第i次迭代
    if(子集V[j]中不包含i)
    对V[j]中的每个元素k,计算d[i][j]=min(c[i][k]+d[k][j-1]);
    3.对V[2n-1-1]中的每一个元素k,计算d[0][2n-1-1]=min(c[0][k]+d[k][2n-1-2]);
    4.输出最短路径长度d[0][2n-1-1];

8、算法分析
在这里插入图片描述

  • 15
    点赞
  • 156
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值