1. 蛮力法:
基本思想:
找出所有可能的旅行路线,即依次考查图中所有顶点的全排列,从中选择路径长度最短的哈密顿回路(也称简单回路).
时间复杂性: Ω(n!)
2. 动态规划法:
伪代码:
输入: 图的代价矩阵arc[n][n]
输出: 从顶点0出发经过所有顶点一次且一次再回到顶点0的最短路径长度
1. 初始化第0列:
for(i=1; i<n; i++)
d[i][0]=arc[i][0];
2. 依次处理每一个子集数组V[2^(n-1)]
for(i=1; i<n; i++)
if(子集V[j]中不包含i)
对V[j]中的每个元素k,计算d[i][j]=min{arc[i][k]+d[k][j-1]};
3. 输出最短路径长度d[0][2^(n-1)-1].
时间复杂性: Ω(2^n)
3. 贪心法:
3.1: 最近邻点策略求解TSP
伪代码:
输入: 无向带权图G=(V,E),顶点w
输出: 回路长度TSPLength
1. 初始化,P={};TSPLength=0;
2. u=w;V=V-{w};
3. 循环直到集合P中包含n-1条边
3.1 查找与顶点u邻接的最小代价边{u,v},并且v属于集合V;
3.2 P=P+{(u,v)];V=V-{v};TSPLength=TSPLength+Cuv;
3.3 输出经过的路径u->v,u=v,转步骤3继续求解;
4. 输出TSPLength+Cuv.
时间性能:O(n*2)
3.2 : 最短链接策略求解TSP问题
伪代码:
输入: 无向带权图G=(V,E),顶点w
输出: 回路长度TSPLength
1. 初始化: P={};TSPLength=0;
2. E`=E;
3. 循环直到集合P中包含n-1条边
3.1 在E`中选取最短边{u,v};
3.2 E`=E`-{(u,v)};
3.3 如果(顶点u和v在P中不连通&&不产生分歧)
则P=P+{(u,v)};TSPLength=TSPLength+Cuv;
4. 输出TSPLength.
时间性能: O(n*log2n) n倍log以2为底n的对数
4. 分支界限法:
伪代码:
输入: 图G=(V,E)
输出: 最短哈密顿回路
1. 根据限界函数计算目标函数的下界down;采用贪心法得到上届up;
2. 计算根结点的目标函数值并加入待处理的结点表PT;
3. 循环直到某个叶子节点的目标函数值在表PT中取得最小值
3.1 i=表PT中具有最小值的结点;
3.2 对结点i的每个孩子节点x执行下列操作:
3.2.1 估算结点x的目标函数值lb;
3.2.2 若(lb<=up),则将结点x加入表PT中,否则丢失该节点;
4. 将叶子节点对应的最优值输出,回溯求得最优解的各个分量.
5. 近似算法:
伪代码:
输入: 无向带权图G=(V,E)
输出: 近似最短回路
1. 在图中任选一个顶点v;
2. 采用Prim算法生成以顶点v为根节点的最小生成树T;
3. 对生成树T从顶点v出发进行深度优先遍历,得到遍历序列L;
4. 根据L得到图G的哈密顿回路.
时间复杂性: O(n^2)
未完待续...