[精品文档]旅行商问题

合集下载
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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 : : 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]

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

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, //当前费用

相关文档
最新文档