- 1、本文档共16页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
算法设计与分析实验报告
实验三 旅行商问题
院系: 班级: 计算机科学与技术 学号: 姓名: 任课教师: 成绩:
湘 潭 大 学
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 TravelingType : : backtrack(int i)
{if(i ==n){ if(a[x[n-1]][x[n]]!=NoEdgea[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]);
}
} }
Templateclass Type
Type TSP(Type**a, int v[], int n, Type NoEdge)
{TravelingType 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;
Y.cc = 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!)。
旅行商问题的分支界限法算法可描述如下:
使用优先队列来存储活节点,优先队列中的每个活节点都存储从根到该活节点的相应路径。具体算法可描述如下:
Templateclass Type
Class MinHeapNode{ firend TravelingType;
Public:
Operator Type() const {return lcost;}
Private:
Type lcost, //子树费用的下界
cc, //当前费用
rcost; //x[s:n-1]中定点最小出边费用和
Int s, //根节点到当前节点的路径为x[0:s]
*x; //需要进一步有哪些信誉好的足球投注网站的顶点是x[s+1:n-1]
};
四. 算法实现
源程序代码
/*回溯法*/
#includestdio.h
#includetime.h
#define N 5
double cc,//当前路径费用
bestc;//当前最优解费用
double a[N+1][N+1];//邻接矩阵,存放图的信息
文档评论(0)