《数据结构》课程常见问题
----单元 30 旅行商问题
1.旅行商问题的几种求解算法比较?
解析:
动态规划法解 TSP 问题
我们将具有明显的阶段划分和状态转移方程的规划称为动态规划,这种动态规划是在研究多阶段决策问题
时推导出来的,具有严格的数学形式,适合用于理论上的分析.在实际应用中,许多问题的阶段划分并不明显,
这时如果刻意地划分阶段法反而麻烦.一般来说,只要该问题可以划分成规模更小的子问题,并且原问题的最
优解中包含了子问题的最优解(即满足最优子化原理),则可以考虑用动态规划解决.所以动态规划的实质是
分治思想和解决冗余,因此,动态规划是一种将问题实例分解为更小的,相似的子问题,并存储子问题的解而
避免计算重复的子问题,以解决最优化问题的算法策略.
旅行商问题(TSP 问题)其实就是一个最优化问题,这类问题会有多种可能的解,每个解都有一个值,而动态规
划找出其中最优(最大或最小)值的解.若存在若干个取最优值的解的话,它只取其中的一个.在求解过程中,该
方法也是通过求解局部子问题的解达到全局最优解,但与分治法和贪心法不同的是,动态规划允许这些子问
题不独立,(亦即各子问题可包含公共的子子问题)也允许其通过自身子问题的解作出选择,该方法对每一个
子问题只解一次,并将结果保存起来,避免每次碰到时都要重复计算.
关于旅行商的问题,状态变量是 gk(i,S),表示从 0 出发经过 k 个城市到达 i 的最短距离,S 为包含 k 个城市的可
能集合,动态规划的递推关系为:
gk(i,S)=min[gk-1(j,S\{j})+dji] j 属于 S,dji 表示 j-i 的距离.
或者我们可以用:
f(S,v)表示从 v 出发,经过 S 中每个城市一次且一次,最短的路径.
f(S,v)=min { f(S-{u},u)+dist(v,u) }
u in S
f(V,1)即为所求
2.分支限界法解 TSP 问题
旅行商问题的解空间是一个排列树,与在子集树中进行最大收益和最小耗费分枝定界搜
索类似,使用一个优先队列,队列中的每个元素 中都包含到达根的路径.
假设我们要寻找的是最小耗费的旅行路径,那可以使用最小耗费分枝定界法.在实现