当前位置:文档之家› [精品文档]旅行商问题

[精品文档]旅行商问题

算法设计与分析实验报告实验三旅行商问题
院系:
班级:计算机科学与技术
学号:
姓名:
任课教师:
成绩:
湘潭大学
2016年5月
实验三旅行商问题
一. 实验内容
分别编程实现回溯法和分支限界法求TSP问题的最优解,分析比较两种算法的时间复杂度并验证分析结果。

二.实验目的
1、掌握回溯法和分支限界法解决问题的一般步骤,学会使用回溯法和分支限界法解决实际问题;
2、理解回溯法和分支限界法的异同及各自的适用范围。

三. 算法描述
旅行商问题的回溯法算法可描述如下:
Template <class Type>
Class Traveling{
friend Type TSP(int ** , int[],int ,Type);
Private;
Void Backtrack(int i);
Int n, //图G的顶点数
*x; //当前解
*bestx; //当前最优解
Type **a, //图G的邻接矩阵
cc, //当前费用
bestc,//当前最优解
NoEdge; //无边标记
};
Template <class Type>
Void Traveling<Type> : : backtrack(int i)
{if(i ==n){
if(a[x[n-1]][x[n]]!=NoEdge&&a[x[n]][1]!=NoEdge&&
(cc+a[x[n-1]][x[n]]+a[x[n]][1] +a[x[n]][1]<bestc || bestc == NoEdge)){
for(int j = 1;j<=n;j++) bestx[j] = x[j];
bestc == cc + a[x[n-1]][x[n]]+a[x[n]][1]};
}else{
For (int j = i;j<= n;j++)
//是否可进入x[j]子树?
If(a[x[i-1]][x[j]] != NoEdge &&(cc+a[x[i-1]][x[j]] < bestc || bestc == NoEdge)){ //搜素子树
Swap(x[i],x[j]);
cc += a[x[i-1]][x[i]];
Backtrack(i + 1);
cc -= a[x[i-1]][x[i]];
Swap(x[i],x[j]);
}
}
}
Template<class Type>
Type TSP(Type**a, int v[], int n, Type NoEdge)
{Traveling<Type> Y;
//初始化Y
Y.x = new int [n+1];
//置x为单位排列
For(int i = 1;i <= n;i++)
Y.x[i] = i;
Y.a = a;
Y.n = n;
Y.bestc = NoEdge;
Y.bestx = v;
= 0;
Y.NoEdge = NoEdge;
//搜索x[2:n]的全排列
Y.Backtrack(2);
Delete[]Y.x;
Return Y.bestc;
}
算法效率:
如果不考虑更新bestx所需的计算时间,则Backtrack需
要O((n-1)!)计算时间。

由于算法Backtrack在最坏情款下
可能需要更新当前最优解O((n-1)!)次,每次更新需O(n)
计算时间,从而整个算法的计算时间复杂性为O(n!)。

旅行商问题的分支界限法算法可描述如下:
使用优先队列来存储活节点,优先队列中的每个活节点都存储从根到该活节点的相应路径。

具体算法可描述如下:
Template<class Type>
Class MinHeapNode{
firend Traveling<Type>;
Public:
Operator Type() const {return lcost;}
Private:
Type lcost, //子树费用的下界
cc, //当前费用。

相关主题