毕业设计动态环境下的最佳路径的生成.docx
《毕业设计动态环境下的最佳路径的生成.docx》由会员分享,可在线阅读,更多相关《毕业设计动态环境下的最佳路径的生成.docx(37页珍藏版)》请在冰豆网上搜索。
![毕业设计动态环境下的最佳路径的生成.docx](https://file1.bdocx.com/fileroot1/2023-2/2/ef693fa1-ac25-415c-9da4-cb5a4a937d62/ef693fa1-ac25-415c-9da4-cb5a4a937d621.gif)
毕业设计动态环境下的最佳路径的生成
摘要
本课题旨在研究动态环境下的最佳路径的生成。
由于动态情况下寻找最佳路径相对复杂,本课题先从静态出发,完成在静态情况下的若干个最佳路径算法。
如dijkstra算法,floyd算法,改进的dijkstra算法以及A*算法。
在此基础上,进一步研究动态最佳路径的实现过程,并且最终实现动态最佳路径的生成。
本课题利用Matlab进行开发,包括算法编写,绘制最初环境图,最佳路径图以及环境改变后的最佳路径图。
本课题中图以数据结构中的邻接矩阵进行存储,动态环境模拟为起始点可移动,环境的改变则表示为图中路线的权值的改变。
本课题的研究成果可应用于网络中存储信息转发,汽车导航系统,移动机器人等领域。
关键词:
Matlab;dijkstra;floyd;A*;最佳路径
ABSTRACT
Thesubjectaimsataccomplishtogeneratethebestpathunderthedynamicenvironment.Becauseitismoredifficulttogeneratethebestpathunderdynamicenvironmentthanunderthestaticenvironment,wewillaccomplishtoseveralalgorithmsunderthestaticenvironmentfirst,suchasdijkstraalgorithm,floydalgorithm,improveddijkstraalgorithmandA*algorithm.Onthebasis,wewillmakeafurtherresearchaboutthebestpathunderthedynamicenvironment,then,accomplishtogeneratethebestpathunderthedynamicatlast.Thesubjectusematlabtoaccomplishallfunctions,includingcoding,drawthepictureabouttheenvironmentandthereal-timebestpath.Thegraphinformationispresentedaadjacencymatrix,themobilestartpointandthechangeableweightsimulatethedynamicenvironment.Theresultscanbeusedtomanyresearchfield,suchasforwardingthestoreinformationinnetwork,carnavigationsystem,mobilerobotandsoon.
Keywords:
Matlab;dijkstra;floyd;A*;bestpath
1引言
动态最佳路径规划目前正越来越多的应用于各大领域,如移动机器人领域、汽车导航领域、无人飞行机以及网络传输等等。
在以上的某些领域中,动态最佳路径规划甚至是关键技术。
动态最佳路径规划的解决将是科技领域的又一大进步。
同时,现代人生活节奏越来越快,动态最佳路径规划对现代人来说有着极其重要的意义,如何能够解决动态环境下的最佳路径生成也已成为相当重要的现实课题。
目前,比较经典的静态最佳路径算法有dijkstra算法[1],A*算法,floyd算法等,本此研究我将首先对以上几种算法进行理论分析,然后实现静态环境下的路径规划。
动态环境情况复杂,本文将只对普遍情况进行分析,相较于实际情况只是简单的模拟。
在模拟的动态环境下,结合静态最佳路径算法,本文将尽力实现动态最佳路径的生成。
本次课题使用的开发工具是Matlab。
Matlab不仅易于实现编程,而且具有强大的图形处理功能,所有研究成果最终都将以图片的形式表现出来,呈现给大家一个直观的结果。
此外Matlab拥有方便的函数接口,还可为程序设计图形用户界面,便于进行动态研究和用户使用。
此次研究成果适用于多数现实情况。
2开发工具介绍
Matlab是三大数学软件之一,在数学类科技应用软件中在数值计算方面首屈一指。
它可以进行矩阵运算、绘制函数和数据、实现算法、创建用户界面、接其他编程语言的程序等,主要应用于工程计算、控制设计、信号处理与通讯、图像处理、信号检测、金融建模设计与分析等领域。
Matlab的基本数据单位是矩阵,它的指令表达式与数学、工程中常用的形式十分相似,故用MATLAB来解决问题要比用C,FORTRAN等语言完成相同的事情简捷得多。
在新的版本中也加入了对C,FORTRAN,C++,JAVA的支持。
可以直接调用,用户也可以将自己编写的实用程序导入到MATLAB函数库中方便自己以后调用。
Matlab功能非常强大,本次课题主要使用的matlab功能是编写算法,图形图形处理以及图形用户界面(GUI)等,下面将着重介绍这三类功能。
2.1M文件和Matlab编程概述
Matlab提供了及其丰富的内部函数,使得用户通过命令行调通就可以完成很多工作,但是想要更好更有效地利用Matlab,离不开Matlab编程。
用户可以通过组织一个Matlab命令序列完成一个独立的功能,即脚本M文件,把M文件抽象封装,形成可以重复利用的功能模块,就是函数M文件。
这是把Matlab基本函数扩展为实际的用户应用的必经之道[2]。
2.1.1M文件概述
脚本M文件时许多Matlab代码按顺序组成的命令序列集合,不接受参数输入和输出,与Matlab工作区共享变量空间。
脚本M文件一般用来实现一个相对独立的功能。
用户可在命令行窗口直接键入文件名来运行脚本M文件。
函数M文件是为了实现一个单独功能的代码块,它与脚本M文件的不同之处是需要接受参数输入和输出,函数M文件中的代码一般只处理输入参数传递的数据,并把处理结果作为函数输出参数返回给Matlab工作去的指定变量。
因此它具有独立的变量空间。
M文件一般包括以下5部分:
函数声明行(Functiondefinitionline)、H1行(帮助文字的第一行)、帮助文字、M文件正文、注释部分。
通过M函数文件,用户可以把为实现一个抽象功能的Matlb代码封装成一个函数接口,在以后的应用中重复使用。
脚本M文件与函数M文件的关键区别在于有没有function关键字。
2.1.2Matlab编程概述
开发Matlab程序一般需要经历代码书写、调试、优化这几个阶段。
用户可以在Matlab的代码编辑-调试器中完成书写代码和调试,也可在命令窗口通过editfilename命令打开已存在的M文件。
运行脚本M文件只需在命令窗口输入文件名按回车即可,或通过debug菜单的Run选项,或快捷键F5完成。
运行函数M文件,则需要通过命令窗口传递输入参数来调用。
图2-1Matlab代码编辑-调试器
2.2Matlab图形处理功能
数据可视化是Matlab的一项重要功能。
借助图形的帮助,研究人员可以对自己的研究成果、过程等有一个直观的了解。
另外,用户还可以控制图形的颜色和阴影、标注以及图形显示的外观等等。
Matlab提供了丰富的绘图函数和绘图工具,其输出结果显示在命令窗口外的一个图形窗口中。
但是,一般情况下用户需要自己编写Matlab代码来实现个人数据的绘图功能。
通过File菜单中的GenerateM-File就可把绘图结果保存为Matlab函数代码。
这对于代码的重复利用时十分方便的。
图2-2Matlab显示图形窗口
在Matlab数据可视化过程中,Matlab会返回一个用于标识每个图形元素的数值,称之为句柄。
通过对句柄的控制,用户可以对图形进行精确地修改,以达到理想的效果,充分满足用户的需求。
2.3图形用户界面(GUI)
图形用户界面(GUI)是指这样的程序:
用户可以在在前台通过一系列鼠标、键盘操作,指挥后台程序实现某种功能。
这种编程方法大大提高了程序的易用性和交互性。
GUI编程除了要编写程序功能的内核代码,还要编写前台界面。
前台界面由一系列组建组成,包括按钮、单选框、文本框、文本标签、滚动条、坐标轴等等。
我们通过设置这些组建的回调函数,来完成特定交互事件下后台程序完成的功能。
例如,单击鼠标就画一个椭圆、从键盘输入字符转化成数字,文本框可用于输入程序所需的参数等。
程序界面可以通过低级的句柄图形对象创建函数,设置GUI界面下各个交互组建的属性。
这种方法对编程人员要求较高,另外一种相对简单的方法是使用GUIDE辅助设计来创建程序界面,这是一种相对简单的方法,本课题采用此方法设计程序界面。
在Matlab主界面下,选择File菜单下的New子菜单下的GUI选项,创建如下界面:
图2-3使用GUIDE快速创建程序界面
点击图2-3的OK按钮后出现如下界面:
图2-4空白的GUIDE设计界面
图2-4左边为一系列控件,用户可以根据个人需要进行设置,将控件拖到右边的方格区之后可以双击控件进行属性设置。
保存改设计界面之后,会在保存目录产生两个文件:
untitled.fig和untitled.m。
.m文件用来存放GUI程序响应特定时间时调用的函数。
我们可以在.m文件中编写实现程序功能的代码。
3课题初步设计
在课题初步设计阶段,确定本次课题的现实依据、模拟条件、需要完成的功能,实现的步骤、手段。
本次课题研究以邻接矩阵存储网络信息,Matlab的基本处理单位即为矩阵,具有强大的处理矩阵的功能,因此本次课题使用Matlab工具。
3.1课题研究的模拟条件
首先,本文以现实网络中信息转发、汽车导航为基础,为课题研究制定合适的模拟条件,经过分析,确定的本次课题将在如下的条件进行:
1、最佳路径以最短路径代替,将现实中的费用最小,时间最省等各种最优状况统一为距离最短;
2、网络中的距离等信息以邻接矩阵存储,权值即为两点之间的距离,两点之间不存在边的权值为inf,并假设图是连通的(每两个点之间均有路径);
3、动态状况表示为起始点一直在移动,网络中的权值信息可改变(所有权值均为正数),但是其余点的位置不可改变(即使位置改变,也只是改变了权值,路径依然存在,因为起始点可向任何方向移动),也不可在网络中增加点;
4、移动的点可以停在两点之间,可以延原路返回,在该点所在的路线上,如果该路线的权值变为inf,则该点可以到达原来该线段连接的两个点的其中一点。
5、最终研究成果以图形展示,但是图形中的线段长度并不与权值成比例关系,各个点也只是随机分布,仅求美观与形象。
在以上模拟条件下,对课题展开研究,虽然模拟情况较现实情况相当简单,但是最终实现的成果可使用于多种情况,因为时间、费用等情况事实上都可以以数字来表示。
3.2课题拟实现的功能、步骤
3.2.1静态网中的最佳路径规划
在本课题设计初期,本文将首先查询各类书籍、论文及网上资料,分析目前几种经典的最佳路径算法的实现过程、功能(如一般是求指定两点间的最佳路径还是可求网络中任意两点之间的最佳路径)及适用范围,分析比较各种算法的时间复杂度、空间复杂度、优缺点等。
总结出目前流行的最短路径算法以及分析了各种最佳路径算法的基本情况后,利用Matlab语言进行编程,完成静态情况下的最佳路径的生成。
其中以Dijkstra算法为主(时下相当流行的静态最佳路径算法),但是对于求图中任意两点间的最佳路径时,Dijkstra算法并不能显示其优势,相比较而言Floyd算法、改进的Dijkstra算法更适合求任意两点间的最短路径。
本文将尽力实现以上两种算法。
最后,本文还将以两点间的欧几里得距离为估价函数,完成静态路网中的最佳路径规划。
3.2.2实现Matlab图形绘制
利用各种算法求出的最短路径以数字的形式按顺序表现出来,这种方式对于用户来说很不直观,如果能够以图形的方式表现出来,效果就会截然不同。
因此,在完成静态网下的最佳路径规划之后,本文将先研究Matlab的画图技巧(主要是二维图形),实现可以根据邻接矩阵绘制无向图。
由于邻接矩阵并没有包含顶点的位置信息,只有顶点之间的关系,因此我们在绘图的过程中对顶点进行随机分布,然后根据邻接矩阵信息确定顶点之间是否有连线(有连线代表有路径,双向)。
完成图形绘制后,我们还将进行图形标注、标题显示、颜色控制灯操作,使图形更加形象。
同时,为了能使图形产生各种变化,满足后面动态设计的要求,我将学习掌握各类句柄函数、属性修改、图形窗口控制语句、图形标注等等[3],以便在动态情况下能及时修改图形,准确反应网络信息及最佳路径。
3.2.3动态情况下的最佳路径规划
在本文模拟的动态状况下,结合静态网中的最佳路径规划,尽力实现动态最佳路径规划是本次课题的最终目的。
在编写静态网中的最佳路径算法,由于所有的信息都不再改变,我们可以将信息写入程序,编写脚本M文件即可。
但是,动态情况下信息随时可能改变,我们只能使用函数M文件,这样可以接受参数输入,以随时接受信息输入。
输入参数一般情况下是起始点、目标点、邻接矩阵,A*算法比较特殊,邻接矩阵是根据坐标位置生成的,所以输入的信息为坐标,相应的权值跟随坐标的改变而改变。
当然,在生成邻接矩阵后,可以由于各种原因改变路径长度,但是只能比原来的两点间直线距离更长,只有这样才可保证估价函数可纳,可以使该算法得出最优解。
动态情况下的图形也要根据信息的改变而改变,有些情况下修改图形比较简单,则只需在原来的图形进行修改,在情况比较复杂的情况下,本文则进行图形重绘。
3.2.4交互设计
如果不为程序设计用户界面,则每次在Matlab命令窗口输入信息之后,我们都需写一条调用该程序的语句,以此来实现动态。
这对于编程者可能并不麻烦,只要函数名够短,但是对于大部分用户来说就很不方便,甚至是不懂。
为此,本文将为程序编写图形界面,通过点击鼠标等操作就可进行图形绘制,计算最佳路径等功能。
此外用互还可在图形界面输入各种信息,以此描述环境状况,各种控件可以读取这些信息,然后通过最佳路径算法进行计算,及时得出最佳路径,再以图形的方式展现出来,更好地实现动态的效果。
首次绘图、计算可以从txt文件读取邻接矩阵信息,也可手动输入信息(比较麻烦,尤其点数多的时候,邻接矩阵的大小为n*n,n为顶点个数)。
如果用户输入的信息有错,例如起始点或者终点不存在,又或者输入的距离信息有误,程序也会该图形界面显示报错信息,提醒用户重新输入,实现真正的交互和动态。
这部分功能由Malab的图形用户界面(GUI)实现。
3.3现实生活中的应用
本课题的动态研究虽然将现实情况进行了简单的模拟,舍弃了现实生活中很多的状况,但却考虑了现实生活中的一般状况,而且合情合理。
因此,本课题的研究成果可应用于现实生活中的多个领域。
比如,汽车导航系统。
在这种情况下,汽车本身始终是起始点,各个地方则是目标点。
汽车可以位于某条路线的任何位置或者某个地点,由于堵塞等原因可以返回或改变路径,这些本课题都考虑在内。
另外还可用于网络中传输信息(路由转发等等),这种情况起始点每次都是网络中的一个节点,与汽车导航相比更加简单。
此外还有紧急货物运输、无人机(可以设置定时检测环境信息)等领域,也都可以使用相关的成果。
4课题详细设计
4.1经典最佳路径算法分析与比较
4.1.1Dijkstra算法以及改进的Dijkstra算法
Dijkstra算法是目前较为经典的单源最短路径算法,用于求一点到其他所有节点的最短路径。
它的实现要求网络中不存在负权值,并且按照路径长度递增的次序产生到各个节点的最短路径[4]。
Dijkstra算法的基本思路:
1、假设用带权的邻接矩阵W来表示带权图,W(i,j)表示边上的权值。
若不存在,则置W(i,j)为inf(Matlanb识别的最大代替值)。
S为已经找到的从起点v出发的最短路径的终点的集合,它的初始状态为空集。
那么,从v出发到图上其余各定点(终点)vi可能到达的最短路径长度初值为:
D[i]=W(i,s)vi与起点v相邻且属于V,s为起点在图中的标号;
2、选择vj,使得
D[j]=min{D[i]|
}
vj就是当前求得的一条从v出发的最短路径的终点,令
;
3、修改从v出发到集合V-S上的任意顶点vk的可达最短路径长度。
如果D[j]+W(j,k)4、重复操作2、3共n-1次,即可求得从v出发到图上其余各顶点的最短路径。
Dijkstra算法的时间复杂度、空间复杂度以及其他优缺点与图的存储结构有关,对于无向图可用邻接矩阵和邻接多重表来存储,有向图则可用邻接矩阵、邻接表、十字链表存储。
表4-1图的不同存储结构比较
名称
优点
缺点
时间复杂度
邻接矩阵
易于判断两点间的关系,容易求得顶点的度
占用空间大
O(n^2+n*m)
邻接表
节省空间,易于得出顶点出度
不易判断两点关系,入度难求
O(n*m)或O(n+m)
十字链表
空间小,易求入度、出度
结构复杂
同邻接表
邻接多重表
节省空间、易判断两点关系
结构复杂
同邻接表
本次课题以无向图为研究对象,利用Matlab进行开发,以下是Dijkstra算法的Matlab核心代码:
%V表示尚未求得最短路径的终点的集合
%i表示源点
%dd用于存储从源点到其他个点的路径长度(随时改变)
%S用于存储从源点到其他个点的最短路径
dd=[0;i];
kk=2;
[mdd,ndd]=size(dd);
while~isempty(V)
%选出与源点距离最短的点
[tmpd,j]=min(W(i,V));
tmpj=V(j);
%改变其余点到源点的距离
fork=2:
ndd
[tmp1,jj]=min(dd(1,k)+W(dd(2,k),V));
tmp2=V(jj);
tt(k-1,:
)=[tmp1,tmp2,jj];
end
tmp=[tmpd,tmpj,j;tt];
[tmp3,tmp4]=min(tmp(:
1));
iftmp3==tmpd
ss(1:
2,kk)=[i;tmp(tmp4,2)];
else,tmp5=find(ss(:
tmp4)~=0);tmp6=length(tmp5);
ifdd(2,tmp4)==ss(tmp6,tmp4)
%ss[:
k]用于记录一次从源点到k的最短路径经过的点
ss(1:
tmp6+1,kk)=[ss(tmp5,tmp4);tmp(tmp4,2)];
end;
end
dd=[dd,[tmp3;tmp(tmp4,2)]];
V(tmp(tmp4,3))=[];
[mdd,ndd]=size(dd);
kk=kk+1;
end;
[tmp,t]=sort(dd(2,:
));
S=ss(:
t);%对S进行排序,以此输出从顶点i到其他各点点的最短路径
D=dd(1,t);%每列均表示最短路径长度
Dijkstra算法用于求一点到图中其他任意点的最佳路径,这是的时间复杂度为O(n^2),当我们要求任意两点间的最佳路径时,可以重复Dijkstra算法n次,此时的时间复杂度为O(n^3)。
对于这种情况,Dijkstra算法存在着很多不足,尤其是当节点数很大的时候,该算法会占用很多存储空间,而且该算法需要计算从起点到每个节点的最短路径,降低了程序运行的效率。
针对以上缺点,提出的改进的Dijkstra算法基本求解过程如下:
步骤1:
输入加权图,存储在矩阵A中。
步骤2:
对矩阵A进行操作,求任意两点间的最短距离,算法的求解过程如下:
循环。
k以1为步长,从1到n-1执行
(2.1)
b←{1,2,...k-1,k+1,k+2,...n};
kk←length(b)%b的长度
a_id←k;b1←{k+1,k+2,...n};
kk1←length(b1);
(2.2)循环。
反复执行下列语句,直到kk=0。
(2.2.1)循环。
j以1为步长,从1到kk1,执行
te←a(k,a_id)+a(a_id,b1(j));
若te(2.2.2)miid←1
(2.2.3)循环。
j以1为步长,从2到kk,执行
若a(k,b(j))(2.2.4)a_id←b(miid);
b←[b(1:
miid-1),b(miid+1:
kk)];%在数组b中去掉一个元素
kk←length(b);
若a_id>k,执行
miid1←find(b1==a_id);
b1←[b1(1:
midd1-1),b1(miid1+1:
kk1)];
kk1←length(b1);
(2.3)循环。
j以1为步长,从k+1到n,执行a(j,k)←a(k,j)。
4.1.2Floyd算法
Floyd算法用于求图中每一对顶点之间的最短路径。
简单地说,Floyd算法利用了动态规划算法的基本思想[5],即若dik是点vi到vk的最短距离,dkj是顶点vk到vj的最短距离,则dij=dik+dkj。
Floyd算法的基本思想:
对于任何一个顶点vkєV,顶点vi到vj的最短路径经过顶点vk或者不经过顶点vk,比较dij与dik+dkj的大小,若dj>dik+dkj,则令dij=dik+dkj,使dij始终是当前搜索顶点vi和vj之间的最短距离,重复这一过程,最后当搜索完所有顶点vk时,dij就是从顶点vi到顶点vj的最短距离。
Floyd算法的基本步骤:
令dij是顶点vi到vj的最短距离,wij是顶点vi到vj的权值,基本步骤如下:
步骤1:
输入图G的权值矩阵W。
对所有i,j,有dij=wij,k=1;
步骤2:
更新dij。
对所有i,j,若dj>dik+dkj,则令dij=dik+dkj;
步骤3:
k=n,停止,否则转至步骤2。
经过分析,Floyd算法的时间复杂度为O(n^3),其中n为顶点个数,而用Matlab实现饿Floyd算法空间非常节省,所用的临时存储空间只要一个记录各条最短路径信息的矩阵,大小为n*n,该算法的Matlab核心程序如下:
%n为图中顶点个数
fork=1:
n
fori=1:
n
forj=1:
n
ifD(i,k)+D(k,j)D(i,j)=D(i,k)+D(k,j);
path(i,j)=path(i,k);
end
end
end
end
path矩阵记录了各对顶点之间的的最短路径信息,但是并不直观,以下是从path矩阵中提取指定两点之间的最短路径算法:
%m为起点,d为终点
%S用于存储从m至d的最短路径上的各顶点
S(1,1)=m;
whilepath(m,d)~=d
S(1,i)=path(m,d);
m=path(m,d);
i=i+1;
end
S(1,i)=d;
Floyd算法主要用于求任意两点间的最佳路径[6],此时它的时间复杂度与同等情况下的Dijkstra算法相同,均为O(n^3)。
但是,Floyd算法更加节省空间,就编程而言,虽然多了提取最佳路径的步骤,但是总体上更加简单方便。
4.1.3A*算法
A*算法是目前比较流行的启发式搜索算法之一,被广泛地应用于路径优化