数据结构课设 TSP贪心法.docx
- 文档编号:24514713
- 上传时间:2023-05-28
- 格式:DOCX
- 页数:13
- 大小:152.24KB
数据结构课设 TSP贪心法.docx
《数据结构课设 TSP贪心法.docx》由会员分享,可在线阅读,更多相关《数据结构课设 TSP贪心法.docx(13页珍藏版)》请在冰豆网上搜索。
数据结构课设TSP贪心法
学号09730204
数据结构课程设计
设计说明书
题目
TSP问题回溯算法
起止日期:
2011年12月26日至2011年12月30日
学生姓名
徐达
班级
09级网络
(2)班
成绩
指导教师(签字)
电子与信息工程系
2011年12月30日
天津城市建设学院
课程设计任务书
2011—2012学年第1学期
电子与信息工程系网络工程专业2班级
课程设计名称:
数据结构课程设计
设计题目:
TSP问题(回溯法求解)
完成期限:
自2011年12月26日至2011年12月30日共1周
设计依据、要求及主要内容(可另加附页):
一、设计目的
熟悉各种数据结构和运算,会使用数据结构的基本操作解决一些实际问题。
二、设计要求
在本课程设计过程中要求学生:
(1)重视课程设计环节,用严谨、科学和踏实的工作态度对待课程设计的每一项任务;
(2)按照课程设计的题目要求,独立地完成各项任务,严禁抄袭;凡发现抄袭,抄袭者与被抄袭者皆以零分计入本课程设计成绩。
凡发现实验报告或源程序雷同,涉及的全部人员皆以零分计入本课程设计成绩。
(3)学生在接受设计任务后,根据要求认真完成。
(4)认真编写课程设计报告。
三、设计内容
TSP问题(回溯法求解)
1)问题描述
所谓TSP问题是指旅行家要旅行n个城市,要求各个城市经历且仅经历一次,并要求所走的路程最短。
该问题又称为货郎担问题、邮递员问题、售货员问题,是图问题中最广为人知的问题。
2)基本要求
(1)上网查找TSP问题的应用实例;
(2)分析求TSP问题的全局最优解的时间复杂度;
(3)设计一个求近似解的算法;
(4)分析算法的时间复杂度。
3)设计思想
对于TSP问题,一种最容易想到的也肯定能得到最佳解的算法是穷举法,即考虑所有可能的旅行路线,从中选择最佳的一条。
但是用穷举法求解TSP问题的时间复杂度为Ο(n!
),当n大到一定程度后是不可解的。
穷举法的实现过程需要回溯算法。
回溯算法基本思想:
回溯法从开始结点(根结点)出发,以深度优先方式搜索整个解空间。
开始的结点成为活结点,同时也成为当前的扩展结点,并成为当前扩展结点。
如果在当前的扩展结点处不能再向纵深方向移动,则当前这个活结点成为死结点。
此时,应回溯到最近的一个活结点处,并使这个活结点成为当前的扩展结点。
回溯法以这种工作方式递归在解空间中搜索,直至找到所要求的解或解空间中已无活结点为止。
四、参考文献
1.王红梅,数据结构,清华大学出版社;
2.王红梅,数据结构学习辅导与实验指导,清华大学出版社;
3.王晓东,计算机算法设计与分析,电子工业出版社。
目录
1、需求分析5
1.程序的功能:
5
2.输入输出的要求:
5
2、概要设计6
1.程序流程图:
6
2.程序组成:
6
3、详细设计7
4、调试分析9
1.调试问题:
9
2.邻接矩阵:
9
3.树:
9
4.结果:
10
5.存在问题:
10
6.改进设想:
10
5、核心源程序清单和执行结果11
1.类定义:
11
2.函数定义:
11
3.成员函数定义:
12
4.结果:
13
参考文献:
13
1、需求分析
1.程序的功能:
一个旅行家要穿过多个城市,已知城市个数,以及城市间距,求出最短路径解和最短路径长度。
2.输入输出的要求:
输入城市数目N为正整数,城市间距离按邻接矩阵方式排列输入,最小值为0,共有N*N个数值;输出最优解和最优值。
2、概要设计
1.程序流程图:
2.程序组成:
(1)声明一个类,包含带参函数,指针数组,无边标志,当前最优值和最优解,以及用户要输入的邻接矩阵,结点数;
(2)对TSP进行定义和初始化部分;
(3)定义调换函数,设一个中间值,对a,b进行值调换;
(4)TSP成员函数Backtrack(),通过判断对树进行深度优先遍历,并不断比较更新最优值和最优解。
3、详细设计
Backtrack函数:
voidTraveling:
:
Backtrack(inti)
{
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]<=bestc||bestc==NoEdge))
{
for(intj=1;j<=n;j++)
bestx[j]=x[j];
for(j=1;j<=n;j++)
bestx[j]=x[j];
bestc=cc+a[x[n-1]][x[n]]+a[x[n]][1];
}
}
当前扩展结点是排列树的叶结点的父结点,检测是否存在一条从顶点x[n-1]到顶点x[n]和一条从顶点x[n]到顶点1的边。
若存在,则找到一条回路。
判断是否优于当前最优值bestc,若是则更新。
else{
for(intj=i;j<=n;j++)
if(a[x[i-1]][x[j]]!
=NoEdge
&&(cc+a[x[i-1]][x[j]] { 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]); } } } 当前扩展结点位于排列树第i-1层,若存在从顶点x[i-1]到顶点x[i]的边时,x[1: i]构成一条路径,且当x[1: i]费用小于当前最优值时算法进入排列树的第i层,否则将剪去相应子树。 TSP类定义与初始化: intTSP(int**a,intv[],intn,intNoEdge) { TravelingY; Y.x=newint[n+1]; for(inti=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; Y.Backtrack (2); intj; cout<<"最优解: "; for(j=1;j<=n;j++) { cout< } cout< delete[]Y.x; returnY.bestc; } 4、调试分析 1.调试问题: 2.邻接矩阵: A={010881181640108809531600118953020671640160020670} 3.树: 4.结果: 5.存在问题: 由于最优解输出是输出当前最优解,而不是最后一次输出最优解,导致输出的最优解如果有一个以上,在未知情况下只能确定最后一个为最优解。 该问题已经解决,通过将输出语句放置到调用函数之后。 6.改进设想: (1)将改程序用图形界面展示,直接构建城市及间距,而不是由用户通过邻接矩阵输入。 (2)回溯法要搜索所有解,但实际中运算量大,效率低,且调用剪枝函数作用有限,效果并不明显,我认为可以引用遗传算法中的变异思想来提高在较好或最坏情况下的剪纸质量。 5、核心源程序清单和执行结果 1.类定义: classTraveling { friendintTSP(int**,int[],int,int);//声明带参函数。 private: voidBacktrack(inti);//声明回溯函数。 intn,//定点数。 *x,//当前解。 *bestx;//当前最优解。 int**a,//邻接矩阵。 cc,//当前费用。 bestc,//当前最优值。 NoEdge;//无边标记。 }; 2.函数定义: intTSP(int**a,intv[],intn,intNoEdge) { TravelingY;//声明一个类—Y,并对其初始化。 Y.x=newint[n+1];//置X为单位排列。 for(inti=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); intj; cout<<"最优解: "; for(j=1;j<=n;j++) { cout< } cout< delete[]Y.x; returnY.bestc; } 3.成员函数定义: voidTraveling: : Backtrack(inti)//定义成员函数Backtrack()。 { if(i==n)//当前扩展结点是排列树的叶结点的父结点, {//检测是否存在一条从顶点x[n-1]到顶点x[n]和一条从顶点x[n]到顶点1的边。 if(a[x[n-1]][x[n]]! =NoEdge//若存在,则找到一条回路。 判断是否优于当前最优值bestc,若是则更新。 &&a[x[n]][1]! =NoEdge &&(cc+a[x[n-1]][x[n]]+a[x[n]][1]<=bestc||bestc==NoEdge)) { for(intj=1;j<=n;j++) bestx[j]=x[j]; for(j=1;j<=n;j++) bestx[j]=x[j]; bestc=cc+a[x[n-1]][x[n]]+a[x[n]][1]; } } else{//当前扩展结点位于排列树第i-1层,若存在从顶点x[i-1]到顶点x[i]的边时,x[1: i]构成一条路径,且当x[1: i]费用小于当前最优值时算法进入排列树的第i层,否则将剪去相应子树。 for(intj=i;j<=n;j++) if(a[x[i-1]][x[j]]! =NoEdge &&(cc+a[x[i-1]][x[j]] { Swap(x[i],x[j]); cc+=a[x[i-1]][x[i]];//cc记录当前路径的最优值。 Backtrack(i+1); cc-=a[x[i-1]][x[i]]; Swap(x[i],x[j]); } } } 4.结果: 参考文献: [1]王红梅.数据结构.北京: 清华大学出版社,2005: 7—1 [2]王红梅.数据结构学习辅导与实验指导.北京: 清华大学出版社,2005: 7-1 [3]王晓东.计算机算法设计与分析,电子工业出版社,2011: 3-12
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构课设 TSP贪心法 数据结构 TSP 贪心