欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

用动态规划法求解TSP问题

发布时间:2023/12/31 编程问答 44 豆豆
生活随笔 收集整理的这篇文章主要介绍了 用动态规划法求解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、算法分析

总结

以上是生活随笔为你收集整理的用动态规划法求解TSP问题的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。