一、求解TSP问题

1、问题描述

TSP问题是指旅行家要旅行n个城市然后回到出发城市,要求各个城市经历且仅经历一次,并要求所走的路程最短。该问题又称为货郎担问题、邮递员问题、售货员问题,是图问题中最广为人知的问题。

2、最近邻点策略

(1)思想:

从某城市出发,每次在没有到过的城市中选择最近的一个,直到经过了所有的城市,最后回到出发城市。

tsp问题求解代码python 求解tsp问题的算法框架_最优解


(2)算法设计

设图G有n个顶点,边上的代价存储在二维数组w[n][n]中,集合V存储图的顶点,集合P存储经过的边,最近邻点策略求解TSP问题的算法如下:

tsp问题求解代码python 求解tsp问题的算法框架_tsp问题求解代码python_02


(3)算法分析

算法的时间性能为O(n^2),因为共进行n-1次贪心选择,每一次选择都需要查找满足贪心条件的最短边。

(4)最近邻点贪心策略正确性分析

通过实例分析,图中从城市1出发的最优解是1→2→5→4→3→1,总代价只有13。用最近邻点贪心策略求解TSP问题所得的结果不一定是最优解。

当图中顶点个数较多并且各边的代价值分布比较均匀时,最近邻点策略可以给出较好的近似解。不过,这个近似解以何种程度近似于最优解,却难以保证。例如,在图中,如果增大边(2,1)的代价,则总代价只好随之增加,没有选择的余地。

3、最短链接策略

(1)思想:每次在整个图的范围内选择最短边加入到解集合中,但是,要保证加入解集合中的边最终形成一个哈密顿回路。因此,当从剩余边集E’中选择一条边(u, v)加入解集合S中,应满足以下条件:

① 边(u, v)是边集E’中代价最小的边;

② 边(u, v)加入解集合S后,S中不产生回路;

③ 边(u, v) 加入解集合S后,S中不产生分枝(就是没有节点度数超过3);

tsp问题求解代码python 求解tsp问题的算法框架_短链接_03


(2)算法设计

设图G有n个顶点,边上的代价存储在二维数组w[n][n]中,集合E’是候选集合即存储所有未选取的边,集合P存储经过的边,最短链接策略求解TSP问题的算法如下:

tsp问题求解代码python 求解tsp问题的算法框架_tsp问题求解代码python_04


(3)算法分析

tsp问题求解代码python 求解tsp问题的算法框架_最优解_05


(4)最短链接贪心策略正确性分析

     通过实例分析,图中从城市1出发的最优解是1→2→5→4→3→1,总代价只有13。

     用最短链接贪心策略求解TSP问题所得的结果不一定是最优解。