[精品文档]旅行商问题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
算法设计与分析实验报告实验三旅行商问题
院系:
班级:计算机科学与技术
学号:
姓名:
任课教师:
成绩:
湘潭大学
2016年5月
实验三旅行商问题
一. 实验内容
分别编程实现回溯法和分支限界法求TSP问题的最优解,分析比较两种算法的时间复杂度并验证分析结果。
二.实验目的
1、掌握回溯法和分支限界法解决问题的一般步骤,学会使用回溯法和分支限界法解决实际问题;
2、理解回溯法和分支限界法的异同及各自的适用范围。
三. 算法描述
旅行商问题的回溯法算法可描述如下:
Template
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
Void Traveling
{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] 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 Type TSP(Type**a, int v[], int n, Type NoEdge) {Traveling //初始化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 MinHeapNode{ firend Traveling Public: Operator Type() const {return lcost;} Private: Type lcost, //子树费用的下界 cc, //当前费用