TSP问题的解决与实现Word格式文档下载.docx
- 文档编号:13949575
- 上传时间:2022-10-15
- 格式:DOCX
- 页数:27
- 大小:66.34KB
TSP问题的解决与实现Word格式文档下载.docx
《TSP问题的解决与实现Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《TSP问题的解决与实现Word格式文档下载.docx(27页珍藏版)》请在冰豆网上搜索。
旅行家要旅行n个城市,要求各个城市经历且仅经历一次,最终要回到出发的城市,求出最短路径。
用图论的术语来说,假如有一个图G=(V,E),其中V是顶点集,E是边集,设D=(dij)是由顶点i和顶点j之间的距离所组成的距离矩阵。
TSP问题就是求出一条通过每个顶点且每个顶点只通过一次的具有最短距离的回路。
(2)基本要求
a.上网查找TSP问题的应用实例;
b.分析求TSP问题的全局最优解的时间复杂度;
c.设计一个求近似解的算法;
d.分析算法的时间复杂度。
(3)测试数据
5个城市的TSP问题:
注:
由于矩阵所表示的是两个城市之间的距离,所以该矩阵为对称矩阵
路程矩阵如图所示:
1
2
3
4
∞
25
41
32
28
18
31
26
7
11
最短路径为v0v1v4v2v3
2.需求分析
(1)本程序用于求解n个结点的最短哈密尔顿回路问题。
(2)程序运行后显示提示信息—“Pleaseinsertthenumberofcities:
”,例如用户输入5,则表示结点n的值为5;
接下来程序输出提示信息—“Pleaseinsertthedistancebetweenonecityandanother:
”,例如用户输入测试数据中给出的路程矩阵,表示任意两个城市之间的距离,比如第一个城市到第0个城市之间的距离为25。
(3)用户输入数据完毕,程序将输出运算结果。
(4)测试数据均为正数,其中用999来表示两个城市之间距离为∞。
3.概要设计
为了实现上述程序功能,使用优先队列来维护结点表,因此需要图和队列两个抽象数据类型。
(1)图的抽象数据类型定义
ADTGraph{
Data:
具有相同类型的数据元素的集合,称为顶点集。
Relation:
顶点偶对的有穷集合。
Operation:
CreateGraph(&
G,V,VR)
初始条件:
V是图中顶点集合,VR是图中顶点偶对集合。
操作条件:
按照V和VR的定义构造图G。
DestroyGraph(&
G)
图G已经存在。
操作结果:
销毁G。
LocateVex(G,u)
图G已经存在,u和G中顶点有相同类型。
操作结果:
如果G中存在u,则返回u在G中的位置;
否则返回相应信息。
GetVex(G,v)
图G已经存在,v是G中某个顶点。
返回v的值。
PutVex(&
G,v,value)
图G已经存在,v是G中顶点。
对v赋值value。
FirstAdjvex(G,v)
返回v的第一个邻接顶点。
如果v在G中没有邻接顶点,则返回相应信息。
NextAdjvex(G,v,w)
图G已经存在,v是G中顶点,w是v的邻接顶点。
返回v的下一个邻接顶点。
如果w是v的最后一个邻接点,则返回相应信息。
InsertVex(&
G,v,w)
图G已经存在,v和w是G中顶点。
在G中添加v。
DeleteVex(&
G,v)
删除G中顶点v及其相关的边。
InsertEdge(&
在G中添加<
v,w>
;
如果G是无向图,则还增添<
w,v>
。
DeleteEdge(&
在G中删除<
;
如果G是无向图,则还删除<
DFSTraverse(G,v)
从v起深度访问G。
BFSTraverse(G,v)
从v起广度访问G。
}ADTGraph
(2)队列的抽象数据类型
ADTQueue{
Data:
具有相同数据类型的及先进先出特性的数据元素集合。
Relation:
相邻数据元素具有前驱和后继的关系。
InitQueue(&
Q)
无
创造一个空队列Q。
DestroyQueue(&
队列Q已经存在。
销毁Q。
ClearQueue(&
重置Q为空队列。
QueueLength(Q)
返回Q的元素个数。
GetHead(Q,&
e)
队列Q已经存在并且非空。
用e返回Q的队头元素。
EnQueue(&
Q,e)
DeQueue(&
Q,&
队列Q已经存在且非空。
删除Q的队头元素,并用e返回其值。
}ADTQueue
(3)本程序包含三大模块:
主程序模块,TSP算法模块,辅函数模块。
三大模块之间的调用关系如下。
主函数模块
TSP算法模块
辅函数模块
4.详细设计
(1)元素类型、结点类型和指针类型、变量和数据结构声明
Node*xnode;
//父亲结点指针
Node*ynode;
//儿子结点指针
Node*znode;
Node*qbase;
//优先队列首指针
ElemTypebound;
//当前可行解的最优值
typedefintElemType;
//元素类型
#defineMAX_VALUE_OF_TYPE999;
//代表∞
城市顶点用数字0,1,2,……,n-1编号。
在搜索的过程中,各个结点的数据是动态变化的,互不相同,发生回溯时,必须使用结点中原来的数据。
因此,每个结点的数据必须是局部与该结点的。
用如下的数据结构来定义结点中所使用的数据:
typedefstructNode{
ElemTypec[100][100];
//路程矩阵
intinit_row[100];
//路程矩阵的当前行映射为原始行
intinit_col[100];
//路程矩阵的当前列映射为原始列
intcur_row[100];
//路程矩阵的原始行映射为当前行
intcur_col[100];
//路程矩阵的原始列映射为当前列
intad[100];
//回路顶点邻接表
intk;
//当前路程矩阵的阶
ElemTypew;
//结点的下界
structNode*next;
//队列链指针
}Node;
(2)队列类型
typedefstructQNode{
Node*data;
//数据域
structQNode*next;
//指针域
}QNode,*QueuePtr;
typedefstruct{
QueuePtrfront;
//头指针,指向链队头结点
QueuePtrrear;
//尾指针,指向链队列最后一个结点
}LinkQueue;
程序中所用到的关于优先队列基本操作实现的伪码算法如下:
voidInitQueue(LinkQueue&
Q){
//构造一个空链队列Q
Q.front=Q.rear=newQNode;
Q.front->
next=NULL;
}//InitQueue
voidEnQueue(LinkQueue&
Q,Node*e){
//插入一个指针e到链队列Q中,成为新的队尾指针
QueuePtrp;
p=newQNode;
p->
data=e;
Q.rear->
next=p;
Q.rear=p;
}//EnQueue
Node*DeQueue(LinkQueue&
//若链队列Q为空,则返回NULL;
否则返回指向数据的指针
QNode*p;
Node*e;
if(Q.front->
next==NULL)returnNULL;
p=Q.front->
next;
e=p->
data;
next=p->
if(Q.rear==p)Q.rear=Q.front;
deletep;
returne;
}//DeQueue
(3)辅助函数的实现(共7个)
ElemTypeRow_min(Node*node,introw,ElemType&
second){
//计算路程矩阵行的最小值
if(node->
c[row][0]<
node->
c[row][1]){
temp=node->
c[row][0];
second=node->
c[row][1];
}
else{
for(i=2;
i<
k;
i++){
c[row][i]<
temp){
second=temp;
c[row][i];
elseif(node->
second)
returntemp;
ElemTypeCol_min(Node*node,intcol,ElemType&
//计算路程矩阵列的最小值
c[0][col]<
c[1][col]){
c[0][col];
c[1][col];
c[i][col]<
c[i][col];
E
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- TSP 问题 解决 实现