ImageVerifierCode 换一换
格式:DOCX , 页数:16 ,大小:77.10KB ,
资源ID:24457998      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/24457998.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(算法设计与分析实验报告旅行商问题.docx)为本站会员(b****4)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

算法设计与分析实验报告旅行商问题.docx

1、算法设计与分析实验报告旅行商问题算法设计与分析实验报告实验三 旅行商问题院系: 班级: 计算机科学与技术学号: 姓名: 任课教师: 成绩:湘 潭 大 学2016年5月 实验三 旅行商问题一. 实验内容分别编程实现回溯法和分支限界法求TSP问题的最优解,分析比较两种算法的时间复杂度并验证分析结果。二实验目的1、掌握回溯法和分支限界法解决问题的一般步骤,学会使用回溯法和分支限界法解决实际问题;2、理解回溯法和分支限界法的异同及各自的适用范围。三. 算法描述旅行商问题的回溯法算法可描述如下:Template Class Traveling friend Type TSP(int * , int,in

2、t ,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(axn-1xn!=NoEdge&axn1!=NoEdge& (cc+axn-1xn+axn1 +axn1bestc | bestc = NoEdge) for(int j = 1;j=n;j+) bestxj = xj;bestc

3、= cc + axn-1xn+axn1;elseFor (int j = i;j= n;j+)/是否可进入xj子树?If(axi-1xj != NoEdge &(cc+axi-1xj bestc | bestc = NoEdge)/搜素子树Swap(xi,xj);cc += axi-1xi;Backtrack(i + 1);cc -= axi-1xi;Swap(xi,xj); TemplateType TSP(Type*a, int v, int n, Type NoEdge)Traveling Y;/初始化YY.x = new int n+1;/置x为单位排列For(int i = 1;i

4、= n;i+)Y.xi = i;Y.a = a;Y.n = n;Y.bestc = NoEdge;Y.bestx = v;Y.cc = 0;Y.NoEdge = NoEdge;/搜索x2:n的全排列Y.Backtrack(2);DeleteY.x;Return Y.bestc;算法效率:如果不考虑更新bestx所需的计算时间,则Backtrack需要O(n-1)!)计算时间。由于算法Backtrack在最坏情款下可能需要更新当前最优解O(n-1)!)次,每次更新需O(n)计算时间,从而整个算法的计算时间复杂性为O(n!)。旅行商问题的分支界限法算法可描述如下:使用优先队列来存储活节点,优先队列

5、中的每个活节点都存储从根到该活节点的相应路径。具体算法可描述如下:TemplateClass MinHeapNode firend Traveling;Public:Operator Type() const return lcost;Private:Type lcost, /子树费用的下界 cc, /当前费用rcost; /xs:n-1中定点最小出边费用和Int s, /根节点到当前节点的路径为x0:s*x; /需要进一步搜索的顶点是xs+1:n-1;四. 算法实现源程序代码 /*回溯法*/#include#include#define N 5double cc,/当前路径费用 bestc;

6、/当前最优解费用double aN+1N+1;/邻接矩阵,存放图的信息int bestxN+1;/当前最优解int xN+1;/当前解void inputAjac() int i,j; for(i=1;i=N;i+) for(j=i+1;j0.0&axNx10.0) if(bestccc+axN-1xN+axNx1) int j; for(j=1;j=N;j+) bestxj=xj; bestc=cc+axN-1xN+axNx1; else int j; for(j=i;j0.0) if(bestccc+axi-1xj+axjx1) int temp; cc+=axi-1xj; temp=xi

7、; xi=xj; xj=temp; backtrack(i+1); temp=xi; xi=xj; xj=temp; cc-=axi-1xj; double tsp() int i; for(i=1;i=N;i+) xi=i; cc=0.0,bestc=-1.0; inputAjac(); backtrack(2); return bestc;void output() int i; for(i=1;i=N;i+) printf(%4d,bestxi); / printf(n);void main() double start,finish; start=clock();/取开始时间 prin

8、tf(城市个数:5n); printf(走%d个城市最少路费为:%lfn,N,tsp(); printf(路径:); output(); printf( 1n); finish=clock(); printf(所需时间 %f msn,(finish-start); /*分支界限法*/#include #include #includeusing namespace std;#define MAX_CITY_NUMBER 10 #define MAX_COST 10000000 int City_GraphMAX_CITY_NUMBERMAX_CITY_NUMBER;int City_Size;

9、 int Best_Cost; int Best_Cost_PathMAX_CITY_NUMBER;typedef struct Node int lcost; int cc; int rcost; int s; int xMAX_CITY_NUMBER; struct Node* pNext; Node;typedef struct MiniHeap Node* pHead; MiniHeap;void InitMiniHeap(MiniHeap* pMiniHeap) pMiniHeap-pHead = new Node; pMiniHeap-pHead-pNext = NULL;void

10、 put(MiniHeap* pMiniHeap,Node node) Node* next; Node* pre; Node* pinnode = new Node; pinnode-cc = node.cc; pinnode-lcost = node.lcost; pinnode-pNext = node.pNext; pinnode-rcost = node.rcost; pinnode-s = node.s; pinnode-pNext = NULL; for(int k=0; kxk = node.xk; pre = pMiniHeap-pHead; next = pMiniHeap

11、-pHead-pNext; if(next = NULL) pMiniHeap-pHead-pNext = pinnode; else while(next != NULL) if(next-lcost) (pinnode-lcost) pinnode-pNext = pre-pNext; pre-pNext = pinnode; break; pre = next; next = next-pNext; pre-pNext = pinnode; Node* RemoveMiniHeap(MiniHeap* pMiniHeap) Node* pnode = NULL; if(pMiniHeap

12、-pHead-pNext != NULL) pnode = pMiniHeap-pHead-pNext; pMiniHeap-pHead-pNext = pMiniHeap-pHead-pNext-pNext; return pnode;void Traveler() int i,j; int temp_xMAX_CITY_NUMBER; Node* pNode = NULL; int miniSum; int miniOutMAX_CITY_NUMBER; MiniHeap* heap = new MiniHeap; InitMiniHeap(heap); miniSum = 0; for

13、(i=0; iCity_Size; i+) miniOuti = MAX_COST; for(j=0; j0 & City_GraphijminiOuti) miniOuti = City_Graphij; if (miniOuti = MAX_COST) Best_Cost = -1; return ; miniSum += miniOuti; for(i=0; ilcost = 0; pNode-cc = 0; pNode-rcost = miniSum; pNode-s = 0; pNode-pNext = NULL; for(int k=0; kxk = Best_Cost_Pathk

14、; put(heap,*pNode); while(pNode != NULL & (pNode-s) City_Size-1) for(int k=0; kxk ; if (pNode-s) = City_Size-2) int edge1 = City_Graph(pNode-x)City_Size-2(pNode-x)City_Size-1; int edge2 = City_Graph(pNode-x)City_Size-1(pNode-x)0; if(edge1 = 0 & edge2 = 0 & (pNode-cc+edge1+edge2) cc + edge1+edge2; pN

15、ode-cc = Best_Cost; pNode-lcost = Best_Cost; pNode-s+; else for (i=pNode-s; ixpNode-spNode-xi = 0) int temp_cc = pNode-cc+City_GraphpNode-xpNode-spNode-xi;int temp_rcost = pNode-rcost-miniOutpNode-xpNode-s; if (temp_cc+temp_rcostBest_Cost) for (j=0; jxpNode-s+1 = Best_Cost_Pathi; temp_xi = Best_Cost

16、_PathpNode-s+1; Node* pNextNode = new Node; pNextNode-cc = temp_cc; pNextNode-lcost = temp_cc+temp_rcost; pNextNode-rcost = temp_rcost; pNextNode-s = pNode-s+1; pNextNode-pNext = NULL; for(int k=0; kxk = temp_xk; put(heap,*pNextNode); delete pNextNode; pNode = RemoveMiniHeap(heap); int main() double

17、 start,finish; start=clock(); int i,j; printf(城市个数:); scanf(%d,&City_Size); for(i=0; iCity_Size; i+) printf(请分别输入每个城市与其它城市的路程花费:); for(j=0; jCity_Size; j+) scanf(%d,&City_Graphij); Traveler(); printf(最少路费:%dn,Best_Cost); finish=clock(); printf(所需时间: %f msn,(finish-start); return 1;五程序运行结果回溯法结果截图:分支界

18、限法结果截图:六实验结果分析回溯法算法的时间复杂度为O(n!),分支界限发算法的时间复杂度为O(2n);从实验结果也可看出分支界限法所需时间少很多。七结论 分支限界法类似于回溯法,也是一种在问题的解空间树T上搜索问题解的算法。但在一般情况下,分支限界法与回溯法的求解目标不同。回溯法的求解目标是找出T中满足约束条件的所有解,而分支限界法的求解目标则是找出满足约束条件的一个解,或是在满足约束条件的解中找出使某一目标函数值达到极大或极小的解,即在某种意义下的最优解。由于求解目标不同,导致分支限界法与回溯法在解空间树T上的搜索方式也不相同。回溯法以深度优先的方式搜索解空间树T,而分支限界法则以广度优先或以最小耗费优先的方式搜索解空间树T。分支限界法的搜索策略是:在扩展结点处,先生成其所有的儿子结点(分支),然后再从当前的活结点表中选择下一个扩展对点。为了有效地选择下一扩展结点,以加速搜索的进程,在每一活结点处,计算一个函数值(限界),并根据这些已计算出的函数值,从当前活结点表中选择一个最有利的结点作为扩展结点,使搜索朝着解空间树上有最优解的分支推进,以便尽快地找出一个最优解。

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1