1.设计目的
1.1课题内容及意义
本次课程设计遵循一般软件生存周期,采用自顶向下的设计思路、面向对象的思想和基于建模的分析方法,从实际情况及需求出发,设计实现了公园导游图系统。此系统交互性较好,可根据使用权限的不同管理某公园内各景点及景点间路线长度,或查询与之有关的信息。在对系统内信息进行管理时对数据进行了较好的封装,安全性和可扩展性较高,可以实现对公园内各景点及景点间路径的存在和路径长度的创建或更新,并能根据需要给出某两个景点间的最短路径和环游整个公园的最优路线。
处理的问题涉及图模型的建立和使用、单源最短路径问题遗迹旅行商问题,涉及到Dijstr算法、回溯和分支限界算法,简单处理了相关数据在数据文件中的存储和使用。是对相关内容所涉及的数据结构、程序设计、算法分析相关课程内容的综合利用和整合。
在具体的设计过程中,逐步建立问题模型并围绕软件生存周期设计系统,从问题分析入手,找到相关问题的解和得出该解的算法,验证该算法的正确性并尝试优化算法。随后根据问题,逐步建立需求、数据、概念和设计的相关模型,并完成功能测试。最终得到具有良好的交互性、可扩展性及复用性且安全性较好的系统。
1.2相关术语及符号表示
1.图、顶点、边:几何上将空间一些点(顶点)和连接这些点的线(边)构成的集合定义为图。图论中将其定义为一个偶对G=(V,E),其中,V表示顶点的集合,E表示边的集合。
2.权值、度、道路:若顶点u、v间有边相连,则可表示为e=<u,v>。e长度称为该边上的权值,表示为|e|=|<u,v>|。设|e|=w(e)即可将带权图表示为G=(V,E;w)。从顶点v出发的边的数目称为v的度,记为d(v)。设顶点和边的交替序列
且两端顶点分别为边的两端点为一条道路。本文中为方便表述,省去边e,用有边相连的顶点表示道路,即μ=<u,v,x>,其中<u,v><v,x>分别是E中的边。
3.回路、哈密顿回路:若对上述道路μ,<v,x>∈E,则称μ为一回路。若图G中存在一条道路P,它通过每一个顶点各一次,则称P为图G 的哈密顿回路,亦称哈密顿环、哈密顿圈。
1.3软件环境
系统环境:Windows 7;
编程环境:Eclipse Luna;
编程语言标准:JDK 12。
2.问题分析
2.1问题来源
已知某公园导游图如图2-1所示,其中a,b,c,d,e,z分别为该公园中的几个景点,出入口均在a附近,各个景点间的道路长度标记为图中两景点间的数字。对公园中的游客,希望公园的管理方能提供这样的路线,使得他们不重复地走完公园中的所有景点且耗费最少的路线(此处的耗费可定义为该路线的长度),同时希望知道其中任意两个景点间的耗费虽少的路线。同时,若公园可以对导游图的信息加以维护,需要任意给定导游图中的各种信息作为输入,重新做上述处理,给出相应结果。
2.2问题抽象
一般而言,对任意的导游图,设此导游图中有n个景点v0,v1…vn-1,景点间有m条路e0,e1…em-1,若则可设此导游图为G=(V,E;w),其中顶点集、边集分别为:
由图2-1可知,在此问题中,显然n=6,m=9。但如果只针对当前情况解决问题,当该公园的景点和道路情况发生变动,则需要重新设计解决方法。为能更一般地解决此问题,并为公园的管理方提供对应于实际情况中景点或道路变动信息改变的处理方式,则需先将导游图中的信息存储在计算机中,并提供给管理方针对这些信息的管理办法,再找到合适的算法,解决上述用户需要找到的两种路线。由此,本次课设需解决的问题包括:
(1)导游图G=(V,E;w)的表示(输入)与存储。
(2)对给定u∈V,v∈V,求,使得其长度最小。
(3)对给定v∈V,求从v出发通过其他所有顶点的回路和其上路径长度和
其中,问题(2)、(3)分别为图论中的单源最短路径问题和旅行商问题。
2.3可行性研究
2.3.1图的表示
对图G=(V,E;w),构造矩阵
其中
2.3.2旅行商问题
根据哈密顿环定理,需要提醒公园方在构建景点及道路时加以限制,从而保证存在一条符合需要的环游路线。在程序处理中,则需要输入的导游图中的数据加以限制,即可以找到至少一条能经过图中所有顶点一次并回到原点的回路。
若已保证存在这样的哈密顿环,在搜索时对V中所有顶点做全排列,可能找到(n-1)!/2种方案。显然,随着n值的不断增大,问题将变得难以计算。已证明旅行商问题属于NPC问题,即不存在实际意义上的最优解,但仍可以找到其在一定条件下的最优近似解。
对V中所有顶点,设可得到其关于G-v的最小生成树T,设C是G的一个最优哈密顿环,显然C-v是G-v的一棵生成树,因此w(T)≤w(C-V),设G中与v关联的且权最小和权次小的两边分别为e和f,则w(T)+w(e)+w(f)≤w©,因此w(T)+w(e)+w(f)即为G最优哈密顿环的下界估计式,若能找到算法使得找到的解接近这一估计,即为相对最优解。
在此条件下,设
(由C中删去
再添加
其满足上述相对最优解的条件,则只需先找到上述回路C。由此,可规定:
则求回路C的步骤如下:
(1)任选u∈V,找与其关联且权最小的边e=<u,v>作为路的开始部分;
(2)设已找出路,在V中取与最近的相邻顶点,得到;
(3)若i+1<w(G)-1,令i=i+1,重复(2),否则,终止。
对旅行售货员问题,其解空间是一棵有排列树,直接遍历所有节点的时间耗费过大。实际应用时只需要找到某个特定的解,即可以达到要求。则可通过采用回溯法对其解空间树进行递归搜索。执行时通过判断能否构成哈密顿环以及当前耗费是否优于已找到的最优耗费,判断是否对当前解进行更新。可在O(N!)的时间耗费内完成计算。或者采用优先队列、最小堆能结构搜索其解空间树,当某个界定上的耗费不足以构成最优耗费,或者不能构成一条回路时,则处死该节点,以减小算法的时间复杂度。
2.3.3单源最短路径问题
如果对图G=(V,E)的任意两个顶点u与v,G中存在一条路<u,v>,则称G是连通图,否则称为非连通图。由实际意义可知,导游图必然是联通的,则对任意两顶点,一定至少存在一条路使得其相连。当此路有且仅有一条时,这条路就是所求的最短路,当有多条路存在时,使其权值之和最小的一条路,即为所求的最短路径。由此,可以设置顶点集合S ,不断地选择使S中权值之和最小且能使得S中的起始顶点与目的顶点有边可达的顶点扩充集合S,当到达目的节点时,所得即为所求的最短路径,亦即求由源顶点到目的顶点的Dijkstra算法。
为证明此算法可得到所求最短路径,需证明其可通过局部最优解得到整体最优解,即Dijkstra算法满足贪心选择性质。同时需证明原问题可分解为相同规模的子问题且子问题的解可合并为原问题的解,亦即满足最优子结构性质。
为证其贪心选择性质,不妨设由此算法得到<v,u>的最小值为D[u],若存在从v到u的更短路径,设改路经过S之外的顶点x∈V-S,再经过其他路径到达u,则D[x]≤<v,x>,同时可知|<v,x>|+|<x,u>|=|<v,u>|<D[u],又|<x,u>|≥0,可推得D[x]<D[u]&#