一、求解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问题 动态规划 python 动态规划解决tsp问题_最优性