用matlab寻找赋权图中的最短路

用matlab寻找赋权图中的最短路
用matlab寻找赋权图中的最短路

用matlab寻找赋权图中的最短路

专业:

小组:第22小组

小组成员:

课题:用matlab寻找赋权图中的最短路

采用形式:集体讨论,并到图书馆搜集相关资料,进行编程,运行。最后以论文的形式表现出来。

1引言

图论是应用数学的一个分支,它的概念和结果来源都非常广泛,最早起源于一些数学游戏的难题研究,如欧拉所解决的格尼斯堡七桥问题,以及在民间广泛流传的一些游戏的难题,如迷宫问题,博弈问题等。这些古老的难题,吸引了很多学者的注意。

1847年,图论应用于分析电路网络,这是它最早应用于工程科学,以后随着科学的发展,图论在解决运筹学,网络理论,信息论,控制论,博弈论以及计算机科学等各个领域的问题时,发挥出很大的作用。在实践中,图论已成为解决自然科学,工程技术,社会科学,军事等领域中许多问题的有力工具之一。

最短路问题是图论理论中的经典问题,寻找最短路径就是在指定网络中两节点间找一条距离最小的路。

2 最短路

2.1 最短路的定义(short-path problem)

对最短路问题的研究早在上个世纪60年代以前就卓有成效了,

若网络中的每条边都有一个数值(长度、成本、时间等),则找出两节点(通常是源节点和阱节点)之间总权和最小的路径就是最短路问题。最短路问题是网络理论解决的典型问题之一,它不仅可以直接应用于解决生产实际的许多问题,如管路铺设、线路安装、厂区布局和设备更新等,而且经常被作为一个基本的工具,用于解决其他的做优化问题。

定义1:若图G=G(V,E)中个边[v i,v j]都赋有一个实数w ij ,则称这样的图G为赋权图,w ij 称为边[v i,v j]上的权。

定义2:给定一个赋权有向图,即给一个有向图D=(V,A),对每一个弧a=(v i,v j),相应地有权w(a)=w ij,又给定D中的两个顶点v s ,v t 。设P是D中从v s 到v t 的一条路,定义路P的权是P中所有弧的权之和,记为w(P)。最短路问题就是要在所有从v s到v t 的路中,求一条权最小的路,即求一条从v s

min w(P)式中对D中所有从v s到v t 的路P最小,到v t 的路P0 ,使w(P0)=

P

称P0 是从v s到v t 的最短路。

2.2最短路问题算法的基本思想及其基本步骤

在求解网络图上节点间最短路径的方法中,目前国内外一致公认的比较好的算法有Dijkstra和Floyd算法。这两种算法,网络被抽象为一个图论中定义的有向图或无向图,并利用图的节点邻接矩阵记录点的关联信息。在进行图的遍历搜

索最短路径时,以该矩阵为基础不断进行目标值的最小性判别,知道获得最后的优化路径。鉴于课本使用Dijkstra 算法,下面用Floyd 算法进行计算: 设A=(a )n*n 为赋权图G=(V ,E ,F )的矩阵,当V i V j ∈E 时,a ij =F (v i ,v j ),否则,取a ij =0,a ij =+∞(i ≠j ),d ij 表示从v i 到v j 的点的距离,r ij 表示从v i 到v j 的点的最短路中的一个点的编号。

① 赋初值。对所有i ,j ,d ij = a ij ,r ij =j ,k=1,转向②;

② 更新d ij ,r ij ,对所有i ,j ,若d ik + d kj < d ij ,则令d ij = d ik + d kj ,r ij =k ,转向; ③ 终止判断。若d ij <0,则存在一条含有顶点v i 的负回路,终止;或者k=n ,终止;否则,另k=k+1,转向②。

最短路线可由r ij 得到。

2.3 用matlab 程序实现上述算法

编写程序函数程序如下:

function f=shortpath(n,A)

clear;

n=input('请输入矩阵的阶n=');

A=input('请输入赋权图对应的n 阶矩阵A='); % 顶点之间不通时,用inf 表示(MATLAB 中,inf 表示无穷)

D=A; %赋初值

for (i=1:n)

for (j=1:n)

R(i,j)=j;

end ;

end %赋路径初值

for (k=1:n)

for (i=1:n)

for (j=1:n)

if (D(i,k)+D(k,j)

D(i,j)=D(i,k)+D(k,j); %更新dij

R(i,j)=k; %更新rij

end ;

end ;

end

k %显示迭代步数

D %显示每步迭代后的路长

R %显示每步迭代后的路径

pd=0;

for (i=1:n) %含有负权

if (D(i,j)<0)

pd=1;

break ;

end ;

end %存在一条含有顶点的vi 的负回路

if (pd)

break;

end %存在一条负回路,终止程序

end%程序结束

3 最短路的实际应用

●最短路问题在交通网络结构的分析,交通运输路线(公路、铁路、河流航运线、航空线、管道运输路线等)的选择,通讯线路的建造与维护,运输货流的最小成本分析,城公共交通网络的规划等,都有直接应用的价值。

●最短路问题在实际中还常用于汽车导航系统以及各种应急系统等(110报警、119火警以及120医疗救护系统),这些系统一般要求计算出到出事地点的最佳路线的时间最短。利用最短路还需要实际计算出前方的行驶路线,这就决定了最短路径问题的实现应该是高效率的。

●根据现在发展的要求,在城乡一体化的总体思路中,为实现农村村村通的目标,针对农村地理分布,进行合理规划,对与优化农村交通网络,促进农村发展有重要的内容。

4 结语

本文将最短路理论与实际相联系,尤其是对与当前热点问题的应用,具有很重要的意义。将实际生活中出现的安全隐患尽量降低。同时也凸显出学习与应用最短路原理的重要性。要在平时的生活中,注意学习中的相关联系,以此可以提高学生学习知识的兴趣。

【参考文献】:

[1] 甘应爱、田丰等. 运筹学(第三版). 北京. 清华大学出版社2006.

[2] 蒲俊等. MATLAB6.0数学手册. 上海. 浦东电子出版社2002

用matlab寻找赋权图中的最短路

用matlab寻找赋权图中的最短路 专业: 小组:第22小组 小组成员: 课题:用matlab寻找赋权图中的最短路 采用形式:集体讨论,并到图书馆搜集相关资料,进行编程,运行。最后以论文的形式表现出来。 1引言 图论是应用数学的一个分支,它的概念和结果来源都非常广泛,最早起源于一些数学游戏的难题研究,如欧拉所解决的格尼斯堡七桥问题,以及在民间广泛流传的一些游戏的难题,如迷宫问题,博弈问题等。这些古老的难题,吸引了很多学者的注意。 1847年,图论应用于分析电路网络,这是它最早应用于工程科学,以后随着科学的发展,图论在解决运筹学,网络理论,信息论,控制论,博弈论以及计算机科学等各个领域的问题时,发挥出很大的作用。在实践中,图论已成为解决自然科学,工程技术,社会科学,军事等领域中许多问题的有力工具之一。 最短路问题是图论理论中的经典问题,寻找最短路径就是在指定网络中两节点间找一条距离最小的路。 2 最短路 2.1 最短路的定义(short-path problem) 对最短路问题的研究早在上个世纪60年代以前就卓有成效了, 若网络中的每条边都有一个数值(长度、成本、时间等),则找出两节点(通常是源节点和阱节点)之间总权和最小的路径就是最短路问题。最短路问题是网络理论解决的典型问题之一,它不仅可以直接应用于解决生产实际的许多问题,如管路铺设、线路安装、厂区布局和设备更新等,而且经常被作为一个基本的工具,用于解决其他的做优化问题。 定义1:若图G=G(V,E)中个边[v i,v j]都赋有一个实数w ij ,则称这样的图G为赋权图,w ij 称为边[v i,v j]上的权。 定义2:给定一个赋权有向图,即给一个有向图D=(V,A),对每一个弧a=(v i,v j),相应地有权w(a)=w ij,又给定D中的两个顶点v s ,v t 。设P是D中从v s 到v t 的一条路,定义路P的权是P中所有弧的权之和,记为w(P)。最短路问题就是要在所有从v s到v t 的路中,求一条权最小的路,即求一条从v s min w(P)式中对D中所有从v s到v t 的路P最小,到v t 的路P0 ,使w(P0)= P 称P0 是从v s到v t 的最短路。 2.2最短路问题算法的基本思想及其基本步骤 在求解网络图上节点间最短路径的方法中,目前国内外一致公认的比较好的算法有Dijkstra和Floyd算法。这两种算法,网络被抽象为一个图论中定义的有向图或无向图,并利用图的节点邻接矩阵记录点的关联信息。在进行图的遍历搜

用matlab实现寻找最短路

用matlab寻找赋权图中的最短路中的应用 1引言 图论是应用数学的一个分支,它的概念和结果来源都非常广泛,最早起源于一些数学游戏的难题研究,如欧拉所解决的格尼斯堡七桥问题,以及在民间广泛流传的一些游戏的难题,如迷宫问题,博弈问题等。这些古老的难题,吸引了很多学者的注意。 1847年,图论应用于分析电路网络,这是它最早应用于工程科学,以后随着科学的发展,图论在解决运筹学,网络理论,信息论,控制论,博弈论以及计算机科学等各个领域的问题时,发挥出很大的作用。在实践中,图论已成为解决自然科学,工程技术,社会科学,军事等领域中许多问题的有力工具之一。 最短路问题是图论理论中的经典问题,寻找最短路径就是在指定网络中两节点间找一条距离最小的路。 2 最短路 2.1 最短路的定义(short-path problem) 对最短路问题的研究早在上个世纪60年代以前就卓有成效了,其中对赋权图()0 w≥的有效算法是由荷兰著名计算机专家E.W.Dijkstra在1959年首次提出的,该算法ij 能够解决两指定点间的最短路,也可以求解图G中一特定点到其它各顶点的最短路。后来海斯在Dijkstra算法的基础之上提出了海斯算法。但这两种算法都不能解决含有负权的图的最短路问题。因此由Ford提出了Ford算法,它能有效地解决含有负权的最短路问题。但在

现实生活中,我们所遇到的问题大都不含负权,所以我们在()0ij w≥的情况下选择Dijkstra算法。 若网络中的每条边都有一个数值(长度、成本、时间等),则找出两节点(通常是源 节点和阱节点)之间总权和最小的路径就是最短路问题。最短路问题是网络理论解决 的典型问题之一,它不仅可以直接应用于解决生产实际的许多问题,如管路铺设、线 路安装、厂区布局和设备更新等,而且经常被作为一个基本的工具,用于解决其他的 做优化问题。 定义1:若图G=G(V,E)中个边[v i ,v j]都赋有一个实数w ij ,则称这样的图G 为赋权图,w ij 称为边[v i ,v j]上的权。 定义2:给定一个赋权有向图,即给一个有向图D=(V,A),对每一个弧a=(v i ,v j),相应地有权w(a)=w ij,又给定D中的两个顶点v s ,v t 。设P是D中从v s 到v t 的一条路,定义路P的权是P中所有弧的权之和,记为w(P)。最短路问题就是要在所有从v s到v t 的路中,求一条权最小的路,即求一条从v s到v t 的路P0 ,使w(P0)= min w(P) P 式中对D中所有从v s到v t 的路P最小,称P0 是从v s到v t 的最短路。 2.2 最短路问题算法的基本思想及其基本步骤 在求解网络图上节点间最短路径的方法中,目前国内外一致公认的比较好的算法有Dijkstra和Floyd算法。这两种算法,网络被抽象为一个图论中定义的有向图或无向图,并利用图的节点邻接矩阵记录点的关联信息。在进行图的遍历搜索最短路径时,以该矩阵为基础不断进行目标值的最小性判别,知道获得最后的优化路径。鉴于课本使用Dijkstra算法,下面用Floyd算法进行计算: 设A=(a)n*n 为赋权图G=(V,E,F)的矩阵,当V i V j ∈E时,a ij =F(v i,v j),否则,取a ij =0,a ij =+∞(i≠j),d ij 表示从v i到v j 的点的距离,r ij 表示从v i到v j 的点的最短路中的一个点的编号。 ①赋初值。对所有i,j,d ij = a ij ,r ij =j,k=1,转向②; ②更新d ij ,r ij ,对所有i,j,若d ik + d kj < d ij ,则令d ij = d ik + d kj ,r ij =k,转向; ③终止判断。若d ij <0,则存在一条含有顶点v i的负回路,终止;或者k=n,终止;否则, 另k=k+1,转向②。 最短路线可由r ij得到。

用动态规划法实现有向图的最短路径问题。

动态规划法实现有向图的最短路径实验 实验题目: 设计一个求解有向图,单源最短路径的算法 实验目的: 1)了解,并掌握分支限界算法思想 2)会编写常见算法。 实验要求: 1.编写实验代码 2.分析算法时间和空间复杂度 实验主要步骤: 1 算法代码 package suanfa; publicclass ShortPath{ privatestatic Integer M = Integer.MAX_VALUE; publicstaticvoid main(String[]args){ int[][]c={{M,4,2,3,M,M,M,M,M,M}, {M,M,M,M,9,8,M,M,M,M}, {M,M,M,M,6,7,8,M,M,M}, {M,M,M,M,M,4,7,M,M,M}, {M,M,M,M,M,M,M,5,6,M}, {M,M,M,M,M,M,M,8,6,M}, {M,M,M,M,M,M,M,6,5,M}, {M,M,M,M,M,M,M,M,M,7}, {M,M,M,M,M,M,M,M,M,3}, {M,M,M,M,M,M,M,M,M,M}}; shortPath(10,c); } publicstaticvoid shortPath(int n,int[][]c){ int[] cost=newint[n];//cost[i]存储i到n-1的子问题的最短路径值 int[] path=newint[n];//path[i]存储状态,使cij+cost[i]最小的j值 //对数组cost[n]和path[n]进行初始化 for(int i=0;i=0;i--){

最短路径法射线追踪的MATLAB实现

最短路径法射线追踪的MATLAB 实现 李志辉 刘争平 (西南交通大学土木工程学院 成都 610031) 摘 要:本文探讨了在MA TLAB 环境中实现最短路径射线追踪的方法和步骤,并通过数值模拟演示了所编程序在射线追踪正演计算中的应用。 关键词:最短路径法 射线追踪 MATLAB 数值模拟 利用地震初至波确定近地表介质结构,在矿产资源的勘探开发及工程建设中有重要作用。地震射线追踪方法是研究地震波传播的有效工具,目前常用的方法主要有有限差分解程函方程法和最小路径法。最短路径方法起源于网络理论,首次由Nakanishi 和Yamaguchi 应用域地震射线追踪中。Moser 以及Klimes 和Kvasnicha 对最短路径方法进行了详细研究。通过科技人员的不断研究,最短路径方法目前已发展较为成熟,其基本算法的计算程序也较为固定。 被称作是第四代计算机语言的MA TLAB 语言,利用其丰富的函数资源把编程人员从繁琐的程序代码中解放出来。MA TLAB 用更直观的、符合人们思维习惯的代码,为用户提供了直观、简洁的程序开发环境。本文介绍运用Matlab 实现最短路径法的方法和步骤,便于科研院校教学中讲授、演示和理解最短路径方法及其应用。 1 最短路径法射线追踪方法原理 最短路径法的基础是Fermat 原理及图论中的最短路径理论。其基本思路是,对实际介质进行离散化,将这个介质剖分成一系列小单元,在单元边界上设置若干节点,并将彼此向量的节点相连构成一个网络。网络中,速度场分布在离散的节点上。相邻节点之间的旅行时为他们之间欧氏距离与其平均慢度之积。将波阵面看成式由有限个离散点次级源组成,对于某个次级源(即某个网格节点),选取与其所有相邻的点(邻域点)组成计算网格点;由一个源点出发,计算出从源点到计算网格点的透射走时、射线路径、和射线长度;然后把除震源之外的所有网格点相继当作次级源,选取该节点相应的计算网格点,计算出从次级源点到计算网格点的透射走时、射线路径、和射线长度;将每次计算出来的走时加上从震源到次级源的走时,作为震源点到该网格节点的走时,记录下相应的射线路径位置及射线长度。 图1 离散化模型(星点表示震源或次级震源,空心点为对应计算网格点) 根据Fermat 原理逐步计算最小走时及射线方向。设Ω为已知走时点q 的集合,p 为与其相邻的未知走时点,tq 分别和p 点的最小走时,tqp 为q 至p 最小走时。r 为p 的次级源位置,则 )}(min :{qp q P t t t q r q +==Ω ∈ 根据Huygens 原理,q 只需遍历Q 的边界(即波前点),当所有波前邻点的最小走时都求出时,这些点又成为新的波前点。应用网络理论中的最短路径算法,可以同时求出从震源点传至所有节点之间的连线近似地震射线路径。 2 最短路径法射线追踪基本算法步骤 把网格上的所有节点分成集合p 和q ,p 为已知最小旅行时的结点总数集合,q 为未知最小旅行时的节点的集合。若节点总数为n ,经过n 次迭代后可为求出所有节点的最小旅行时。过程如下: 1) 初始时 q 集合包含所有节点,除震源s 的旅行时已知为ts =0外,其余所有节点的旅行时均为ti =(i 属于Q 但不 等于s )。P 集合为空集。 2) 在Q 中找一个旅行时最小的节点i ,它的旅行时为ti ; 3) 确定与节点i 相连的所有节点的集合V ; 4) 求节点j (j 属于V 且j 不属于P )与节点i 连线的旅行时dtij ; 5) 求节点j ()的新旅行时tj (取原有旅行时tj 与tj +dtij 的最小值); 6) 将i 点从Q 集合转到P 集合; 7) 若P 集合中的节点个数小于总节点数N ,转2,否则结束旅行时追踪; 8) 从接收点开始倒推出各道从源点道接收点的射线路径,只要每个节点记下使它形成最小旅行时的前一个节点号,

最短路问题(整理版)

最短路问题(short-path problem) 若网络中的每条边都有一个权值值(长度、成本、时间等),则找出两节点(通常是源节点与结束点)之间总权和最小的路径就是最短路问题。最短路问题是网络理论解决的典型问题之一,可用来解决管路铺设、线路安装、厂区布局和设备更新等实际问题。最短路问题,我们通常归属为三类:单源最短路径问题(确定起点或确定终点的最短路径问题)、确定起点终点的最短路径问题(两节点之间的最短路径) 1、Dijkstra算法: 用邻接矩阵a表示带权有向图,d为从v0出发到图上其余各顶点可能达到的最短路径长度值,以v0为起点做一次dijkstra,便可以求出从结点v0到其他结点的最短路径长度 代码: procedure dijkstra(v0:longint);//v0为起点做一次dijkstra begin//a数组是邻接矩阵,a[i,j]表示i到j的距离,无边就为maxlongint for i:=1 to n do d[i]:=a[v0,i];//初始化d数组(用于记录从v0到结点i的最短路径), fillchar(visit,sizeof(visit),false);//每个结点都未被连接到路径里 visit[v0]:=true;//已经连接v0结点 for i:=1 to n-1 do//剩下n-1个节点未加入路径里; begin min:=maxlongint;//初始化min for j:=1 to n do//找从v0开始到目前为止,哪个结点作为下一个连接起点(*可优化) if (not visit[j]) and (min>d[j]) then//结点k要未被连接进去且最小 begin min:=d[j];k:=j;end; visit[k]:=true;//连接进去 for j:=1 to n do//刷新数组d,通过k来更新到达未连接进去的节点最小值, if (not visit[j]) and (d[j]>d[k]+a[k,j]) then d[j]:=a[k,j]+d[k]; end; writeln(d[n]);//结点v0到结点n的最短路。 思考:在实现步骤时,效率较低需要O(n),使总复杂度达到O(n^2)。对此可以考虑用堆这种数据结构进行优化,使此步骤复杂度降为O(log(n))(总复杂度降为O(n log(n))。 实现:1. 将与源点相连的点加入堆(小根堆),并调整堆。 2. 选出堆顶元素u(即代价最小的元素),从堆中删除,并对堆进行调整。 3. 处理与u相邻(即下一个)未被访问过的,满足三角不等式的顶点 1):若该点在堆里,更新距离,并调整该元素在堆中的位置。 2):若该点不在堆里,加入堆,更新堆。 4. 若取到的u为终点,结束算法;否则重复步骤2、3。 **优化代码:(DIJKSTRA+HEAP) program SSSP;{single source shortest path} {假设一个图的最大节点数为1000,所有运算在integer范围内} {程序目标:给定有向图的邻接表,求出节点1到节点n的最短路径长度} const maxn=1000;{最大节点数} var n:integer;{节点个数} list:array[1..maxn,1..maxn] of integer;{邻接矩阵,表示边的长度}

赋权图的最短路与关键路的算法与实现

赋权图的最短路与关键路的算法与实现 摘要:图形是由点和线构成的集合.赋权图的最短路就是任意两个节点之间的权值之和最小的路径.最短路不仅仅指一般地理意义上的距离最短,还可以引申到其它的度量, 如时间、费用、线路容量等.本文介绍了如何求最短路的有效算法: Dijkstra算法.它能求出赋权图的任何两个节点之间权值之和的最小路径. 关键路径通常总是决定项目工期的进度活动序列.它是项目中从发点到收点的最长路径.关键路径法(Critical Path Method,CPM)是一种通过分析哪个活动序列(哪条路线)进度安排的总时差最少来预测项目工期的一门网络分析技术.关键路径法,能推算出项目的最短完成时间和项目各项活动的可能开始和结束时间. 关键词: 图的邻接矩阵; 最短路径; Dijkstra算法; 关键路径

The algorithm and implementation of the Shortest Path and the Critical Path Abstract: Graphics are constituted by the sets of points and lines. The shortest path of the weighted graph is the minimum sum of the weight between any two vertices. The shortest path not only refers to the shortest distance, but also can be extended to other metrics, such as time, cost, line capacity and so on. Dijkstra’s algorithm was the most efficient algorithm for how to find the Shortest Path of weighted graph, which is studied in this paper. Dijkstra’s algorithm was used to calculate the minimum value of weighted graph between any two vertices. The critical path is usually used to obtain the progress of the project in activities. It is the longest path of a project from the starting point to the ending point. The critical path method (Critical Path Method, CPM) which analysis a sequence of the least time in activities or predict (which route) the schedule better. The critical path method can be used to calculate the shortest completion time, starting and ending times in project activities. Keywords: Adjacency matrix of the graph; The Shortest Path; Dijkstra’s algorithm; The Critical Path

运筹学中多阶段有向图的公式

§5.3 多阶段有向图中的最短路问题 5个部分: {}{ }{}{}{}E D D D C C B B B A ,,,,,,,,,32121321 初态、终态、始态、末态、状态I 赋权多阶段有向图 图5.7 解: 8356676m i n ),(1=?? ????????+++=E C l ,31)(D C d =, 53264min ),(2=? ?? ?? ?++=E C l ,32)(D C d =, 85386min ),(3),(6min ),(211=??? ???++=? ???? ?++=E C l E C l E B l ,21)(C B d =, 类似:125785min ),(7),(5min ),(212 =??? ???++=? ?????++=E C l E C l E B l ,22)(C B d =, 95481m i n ),(4),(1m i n ),(213=??????++=? ???? ?++=E C l E C l E B l ,.,)(213C C B d = 99812481min ),(8),(4),(1min ),(321=? ? ? ???????+++=??????????+++=E B l E B l E B l E A l ,1)(B A d =,

因此:最短路 .,,,,321E D C B A 路长:9 原则:最短路中每节为最短。 §5.4 摹矩阵 表上作业法 摹矩阵的乘规则:乘法=对应元素乘积的和;将乘积摹为求和,将和摹为取小 ),,(?⊕S 对应),,(?+R ⊕叫摹和,?叫摹积 零元素:z :在非负数中为最小,加什么等于什么:{}a z a z a ==⊕,min 单位元素1:e :乘什么等于什么:z z a z a =+=?;a e a e a =+=? 半域),,(?⊕S :不可逆 极小代数:)min,,(+R 代数;+∞=z ,0=e ;{}{}R R S =∞+= ? ? ? ???--=??????⊕???? ??--723213426251753312对应元素取小(摹和) ???? ??????=?????????????????????574624361344348732513 { }763,34,48min 633448=+++=?⊕?⊕?, 关于最长路问题:只需在最短路问题基础上作三点修改 一、)max ,,(+R 即),,(+∨R 是一个半域,也称为极大代数 {} {}∞-= 实数R ,单位元素0,零元素∞- 二、摹乘法为:“相加取大” 三、零元素为∞-,而非∞+ 也可规定路长为各边路长之积,且要求最小 可以在)min,,(?R 上计算就可以了。 因此多阶段有向图的最短路问题的求解过程可以采用:表上作业法

MATLAB解决最短路径问题代码

默认是Dijkstra 算法 是有权的, 我想如果把权都赋1的话, 就相当于没权的了 参数是带权的稀疏矩阵及结点 看看这两个例子(一个有向一个无向), 或许你能找到你想知道的 % Create a directed graph with 6 nodes and 11 edges W = [.41 .99 .51 .32 .15 .45 .38 .32 .36 .29 .21]; %这是权 DG = sparse([6 1 2 2 3 4 4 5 5 6 1],[2 6 3 5 4 1 6 3 4 3 5],W) %有权的有向图 h = view(biograph(DG,[],'ShowWeights','on')) %画图, 这个好玩 % Find shortest path from 1 to 6 [dist,path,pred] = graphshortestpath(DG,1,6) %找顶点1到6的最短路径 % Mark the nodes and edges of the shortest path set(h.Nodes(path),'Color',[1 0.4 0.4]) %上色 edges = getedgesbynodeid(h,get(h.Nodes(path),'ID')); set(edges,'LineColor',[1 0 0]) %上色 set(edges,'LineWidth',1.5) %上色 下面是无向图的例子 % % Solving the previous problem for an undirected graph % UG = tril(DG + DG') % h = view(biograph(UG,[],'ShowArrows','off','ShowWeights','on')) % % Find the shortest path between node 1 and 6 % [dist,path,pred] = graphshortestpath(UG,1,6,'directed',false) % % Mark the nodes and edges of the shortest path % set(h.Nodes(path),'Color',[1 0.4 0.4]) % fowEdges = getedgesbynodeid(h,get(h.Nodes(path),'ID')); % revEdges = getedgesbynodeid(h,get(h.Nodes(fliplr(path)),'ID')); % edges = [fowEdges;revEdges]; % set(edges,'LineColor',[1 0 0]) % set(edges,'LineWidth',1.5) clc;close all; clear; load data; % global quyu; quyu = [2,3];%一片区域 z_jl = lxjl(jdxx,lxxh);%计算路线的距离 z = qyxz(jdxx,quyu,z_jl); % 根据节点信息,从z中将y区域的节点和路线选出所有点的信息 hzlx(z); %绘制Z的图像

应用Dijkstra算法求赋权图最短路径

给出赋权图,如下图所示: 应用Dijkstra 算法,求出顶点A到其它各点的最短距离,MATLAB源程序m文件清单如下: w=[0 1 inf 2 inf inf 1 0 3 4 inf inf inf 3 0 1 2 2 2 4 1 0 3 inf inf inf 2 3 0 2 inf inf 2 inf 2 0];%图的矩阵存储 n=6;%顶点数目 Result=inf(n-1,n+1);%保存寻找第一个顶点到其余顶点最短路径的中间结果 for i=1:n-1 Result(1,i)=w(1,i+1); end for i=2:n-1 ValMin=inf;IndMin=1; for j=1:n-1 if ValMin>Result(i-1,j) ValMin=Result(i-1,j); IndMin=j; end end Result(i-1,n)=IndMin;Result(i-1,n+1)=ValMin; for j=1:n-1 DelFlag=false; for k=1:i-1 if j==Result(k,n) DelFlag=true; end

if DelFlag==false if Result(i-1,j)>Result(i-1,n+1)+w(Result(i-1,n)+1,j+1) Result(i,j)=Result(i-1,n+1)+w(Result(i-1,n)+1,j+1); else Result(i,j)=Result(i-1,j); end end end end ValMin=inf;IndMin=1; for j=1:n-1 if ValMin>Result(n-1,j) ValMin=Result(n-1,j); IndMin=j; end end Result(n-1,n)=IndMin;Result(n-1,n+1)=ValMin; ValueRoute=inf(n-1,n);%保存用标号表示的第一个顶点到其余顶点的最短路径和最短距离 for i=1:n-1 j=1; while Result(j,n)~=i j=j+1; end IndRoute=n-1; ValueRoute(i,IndRoute)=Result(j,n);ValueRoute(i,n)=Result(j,n+1); ValMin=Result(j,n+1);IndMin=Result(j,n);IndRoute=IndRoute-1; while Result(j,n)>1 j=j-1; if Result(j,IndMin)>ValMin; ValueRoute(i,IndRoute)=Result(j,n); IndRoute=IndRoute-1; ValMin=Result(j,n+1); IndMin=Result(j,n); end end end StringRoute.Route='A ';%结构StringRoute的Route域依次临时存储从第一个顶点到其余顶点的最短路径 StringRoute.Distance=0;%结构StringRoute的Route域依次临时存储从第一个顶点到其余顶点的最短距离 k=2; for i=1:n-1 switch ValueRoute(1,i)

有向图中任意两点之间的最短路径

有向图中任意两点之间的最短路径 一.问题 求出有向图中任意两点之间的最短路径并打印结果 二.语言环境 C++ 三.问题分析 要解决有向图中任意两点之间的最短路径问题首先应解决的问题是 1.从源点到其余各点的最短路径问题 2.每一对定点之间的最短路径问题 对于”○ 1从源点到其余各点的最短路径问题”有经典算法-------“迪杰斯特拉 算法”.该算法的思想是: (1). 如图(A) 图(A ) 路径长度最短的最短路径的特点: 13 21 13 长度最短路径 8 19 20

在这条路径上,必定只含一条弧,并且这条弧的权值最小。 下一条路径长度次短的最短路径的特点: 它只可能有两种情况:或者是直接从源点到该点(只含一条弧);或者是从源点经过顶点v1,再到达该顶点(由两条弧组成)。 再下一条路径长度次短的最短路径的特点: 它可能有三种情况:或者是直接从源点到该点(只含一条弧);或者是从源点经过顶点v1,再到达该顶点(由两条弧组成);或者是从源点经过顶点v2,再到达该顶点。 其余最短路径的特点: 它或者是直接从源点到该点(只含一条弧);或者是从源点经过已求得最短路径的顶点,再到达该顶点。 由以上特点可知: 假设S为已求得最短路径的终点的集合,则可证明:下一条最短路径(设其终点为x)或者是弧(v,x),或者是中间只经过S中的顶点而最后到达终点x的路径。 假设此路径上有一个顶点不在S中,则说明存在一条终点不在S中,而长度比此路径短的路径。但这是不可能的,因为我们是按路径长度递增的次序来产生最短路径的,故长度比此路径短的所有路径均已产生,他们的终点必定在S中,即假设不成立。 设置辅助数组Dist,其中每个分量Dist[k] 表示当前所求得的从源点到其余各顶点k 的最短路径。 一般情况下, Dist[k] = <源点到顶点 k 的弧上的权值> 或者 = <源点到S中某顶点j的路径长度> + <顶点j到顶点 k 的弧上的权值>。

基于MATLAB求解最短路问题

基于MATLAB求解最短路问题 1.引言 MATLAB和Mathematica、Maple并称为三大数学软件。它在数学类科技应用软件中在数值计算方面首屈一指。通过本学期的学习了解和上机实践,已经初步掌握使用MATLAB工具解决实际问题的能力。结合运筹学课程的学习,我考虑使用MATLAB求解最短路问题,而在所有求解最短路的方法中,Dijkstra算法是最为经典的一种,因此本文主要解决在MATLAB环境下使用Dijkstra算法求解最短路。 1.1 提出问题 设6个城市v1,v2,......,v6之间的一个公路网(图1)每条公路为图中的边,边上的权数表示该段公路的长度(单位:百公里),设你处在城市v1,那么从v1到v6应选择哪一路径使你的费用最省。 1.2 分析问题 这属于一个典型的求解最短路的问题,图中顶点代表六个城市,边上的权数表示该段公路的长度,题目所求为从v1到v6、的一条费用最省的路径,我们假设所需费用仅与路径长短有关,因此求费用最省的路径即求权值最小的路径。网络图中各权值均为正,可以使用Dijkstra算法。 1.3 数据整理 将网络图中各边的权作如下整理以方便程序运行 W(1,2)=5; W(2,1)=5; W(1,3)=2; W(3,1)=2; W(2,3)=1; W(3,2)=1; W(2,4)=5; W(4,2)=5; W(2,5)=5; W(5,2)=5;

W(3,4)=8; W(4,3)=8; W(3,5)=10; W(5,3)=10; W(4,5)=2; W(5,4)=2; W(4,6)=5; W(6,4)=5; W(5,6)=2; W(6,5)=2; 2.数学原理 2.1 Dijkstra算法介绍 Dijkstra 算法思想为:设G=(V,E)是一个带权有向图(也可以是无向图,无向图是有向图的特例),把图中顶点集合V分成两组:第一组为已求出最短路径的顶点集合(用S 表示,初始时S 中只有一个源点,以后每求得一条最短路径,就将其加入到集合S 中,直到全部顶点都加入到S 中,算法就结束了);第二组为其余未确定最短路径的顶点集合(用U 表示),按最短路径长度的递增次序依次把第二组的顶点加入S 中。在加入的过程中,总保持从源点v 到S 中各顶点的最短路径长度不大于从源点v 到U 中任何顶点的最短路径长度。此外,每个顶点对应一个距离,S 中的顶点的距离就是从v 到此顶点的最短路径长度,U中的顶点的距离,是从v 到此顶点只包括S 中的顶点为中间顶点的当前最短路径长度。其步骤主要有: 第一,初始时,S 只包含源点,即S={顶点},v 的距离为0。U 包含除v 外的其他顶点,U 中顶点u 距离为边上的权(若v 与u 有边)或(若u 不是v 的出边邻接点)。 第二,从U 中选取一个距离v 最小的顶点k,把k 加入S 中(该选定的距离就是v 到k 的最短路径长度)。 第三,以k 为新考虑的中间点,修改U 中各顶点的距离;若从源点v 到顶点u的距离(经过顶点k)比原来距离(不经过顶点k)短,则修改顶点u 的

最短路径问题matlab求解详尽版

最短路径问题m a t l a b 求解详尽版 Document serial number【UU89WT-UU98YT-UU8CB-UUUT-UUT108】

MATLAB 求最短路径 利用graphshortestpath 可以求最短路径,具体用法参考MATLAB帮助Examples: S=[1 1 2 2 3 3 4 4 4 4 5 6 6 7 8]; %起始节点向量 E=[2 3 5 4 4 6 5 7 8 6 7 8 9 9 9]; %终止节点向量 W=[1 2 12 6 3 4 4 15 7 2 7 7 15 3 10]; %边权值向量,有向图, G(9,9)=0; 9个节点 G=sparse(S,E,W); %关联矩阵的稀疏矩阵表示 G(9,9)=0; P=biograph(G,[],'ShowWeights','on');%建立有向图对象P H=view(P);%显示各个路径权值 [Dist,Path]=graphshortestpath(G,1,9,'Method','Dijkstra') %求节点1到节点9的最短路径 set(Path),'Color',[1 ]);%以下三条语句用红色修饰最短路径edges=getedgesbynodeid(H,get(Path),'ID')); set(edges,'LineColor',[1 0 0]); set(edges,'LineWidth',; %以下是运行结果,节点1到节点9的最短路径为19 Dist = 19 Path =

1 3 4 5 7 9 利用graphallshortestpaths可以求出所有最短路径Dists=graphallshortestpaths(G) %求所有最短路径Dists = 0 1 2 5 9 6 16 12 19 Inf 0 Inf 6 10 8 17 13 20 Inf Inf 0 3 7 4 14 10 17 Inf Inf Inf 0 4 2 11 7 14 Inf Inf Inf Inf 0 Inf 7 Inf 10 Inf Inf Inf Inf Inf 0 Inf 7 15 Inf Inf Inf Inf Inf Inf 0 Inf 3 Inf Inf Inf Inf Inf Inf Inf 0 10

算法设计与分析多段图最短路径问题

关于多段图最短路径问题的探讨 摘要: 本文主要描述的是分别用动态规划法、贪心法和分支限界法来解决多段图最短路径问题时的情况,并在附录中附有实际问题的程序来辅助阐述观点。文章首先阐述了各个方法的原理,主要的思路是通过输入一组数据,比较三者的输出结果的准确性以及运行时间,以之为基础来分析、讨论三者的性能区别。另外,众所周知,多段图是有向图的一个简单的模型,它在有向图的基础上忽略了两点之间的线的双向性的问题,并且对点与点之间的线有很多的要求,从而把图简化为可分为几段的模式,文章最后讲述了若这几种方法运行到有向图中的情况,几种方法的对比和它们比较适应的使用情况的讨论,并给出了自己的建议。 关键字: 多段图最短路径问题动态规划法分支限界法多段图与有向图的关 系有向图最短路径算法 引言: 当前社会,关于最短路径的问题屡屡出现。例如在开车自驾游的一个过程中,排除其他影响因素,从一个地点到另一点,这个时候必然是希望有一条距离最短的路程来尽量减少消耗的时间以及花费的(它们在模型中被称为代价),市场上对该问题的解决有很大的需求,因此,这里我将讨论多段图的最短路径的问题。 在早些时间的课程中,我们学习过数据结构这门课程,其中就包括最短路径这方面的讨论。当时老师给我们介绍了分别面向单源(Dijkstra算法)与非单源(Floyd算法)两种问题的算法法---,这是我们最早的对最短路径方面的理解,也是我们接触的比较早的关于图的问题。在这学期的

算法课程中,我们学习了许多了方法,包括贪心法、动态规划法等算法, 它们把以前学习的许多方法都命名并归纳分类起来,其中有许多算法都是可以用来解决这个最短路径的问题的,并且该问题作为一个图的问题,对该问题的继续探讨优化的需求很大,本文将就不同算法在解决该最短路径问题时的不同方法进行对比并给出该问题在不同基础上不同的最终解决 方案。由于时间的限制,本文将重点分析动态规划法下的情况,并会对图的情况加以简化、限制,最后会对其他的图做一些拓展。 首先,对多段图最短路径问题进行介绍,设图G=(V, E)是一个带权有 向连通图,如果把顶点集合V划分成k个互不相交的子集V i (2≤k≤n, 1 ≤i≤k),使得E中的任何一条边(u, v),必有u∈V i ,v∈V i+m (1≤i<k, 1 <i+m≤k),则称图G为多段图,称s∈V 1为源点,t∈V k 为终点。多段图 的最短路径问题是求从源点到终点的最小代价路径。由于多段图将顶点划分为k个互不相交的子集,所以,多段图划分为k段,每一段包含顶点的一个子集。不失一般性,将多段图的顶点按照段的顺序进行编号,同一段内顶点的相互顺序无关紧要。假设图中的顶点个数为n,则源点s的编号为0,终点t的编号为n-1,并且,对图中的任何一条边(u, v),顶点u 的编号小于顶点v的编号。 这里我们讨论的多段图是可以分段的,各段之间的关系最好是单向的,即对该有向图来说,图中是没有环的存在的。 1.贪心法 贪心法在解决问题的策略上目光短浅,只根据当前已有的信息就做出选择,而且一旦做出了选择,不管将来有什么结果,这个选择都不会改变。换言之,贪心法并不是从整体最优考虑,它所做出的选择只是在某种意义

有向赋权图

图论基本概念 重要定义: 有向图:每条边都是有向边的图。 无向图:每条边都是无向边的图。 混合图:既有有向边又有无向边的图。 自回路:一条边的两端重合。 重数:两顶点间若有几条边,称这些边为平行边,两顶点a,b间平行边的条数成为(a,b)的重数。 多重图:含有平行边的图。 简单图:不含平行边和自回路的图。 注意!一条无向边可以用一对方向相反的有向边代替,因此一个无向图可以用这种方法转化为一个有向图。 定向图:如果对无向图G的每条无向边指定一个方向由此得到的有向图D。称为的G定向图. 底图:如果把一个有向图的每一条有向边的方向都去掉,得无向图G称为的D 底图。 逆图:把一个有向图D的每条边都反向由此得到的图称为D的逆图。 赋权图:每条边都赋上了值。 出度:与顶点相连的边数称为该定点的度数,以该定点为始边的边数为出度。入度:以该定点为终边的边数为入度。 特殊!度数为零的定点称为孤立点。度数为一的点为悬挂点。 无向完全图:在阶无向图中如果任何两点都有一条边关连则称此图是无向完全图。Kn 完全有向图:在阶有向图中如果任意两点都有方向相反的有向边相连则称此图为完全有向图。 竟赛图:阶图中如果其底图是无向完全图,则程此有向完全图是竟塞图。 注意!n阶有向完全图的边数为n的平方;无向完全图的边数为n(n-1)/2。 下面介召图两种操作:①删边:删去图中的某一条边但仍保留边的端点。 ②删点:删去图中某一点以及与这点相连的所有边。 子图:删去一条边或一点剩下的图。 生成子图:只删边不删点。 主子图:图中删去一点所得的子图称的主子图。 补图:设为阶间单无向图,在中添加一些边后,可使成为阶完全图;由这些添加边和的个顶点构成的图称为的补图。 重要定理: 定理5.1.1 设图G是具有n个顶点m条边的有向图,其中点集V={v,v, (v) deg+(vi)=deg-(vi)=m 定理5.1.2 设图G是具有n个顶点m条边的无向图,其中点集V={v,v,v, (v) deg(vi)=2m 推论在无向图中,度数为积数的顶点个数为偶数。 通路和富权图的最短通路 1通路和回路 基本概念: 通路的长度:通路中边的条数。

最短路径的Dijkstra算法及Matlab程序

两个指定顶点之间的最短路径 问题如下:给出了一个连接若干个城镇的铁路网络,在这个网络的两个指定城镇间,找一条最短铁路线。 以各城镇为图G 的顶点,两城镇间的直通铁路为图G 相应两顶点间的边,得图G 。对G 的每一边e ,赋以一个实数)(e w —直通铁路的长度,称为e 的权,得到赋权图G 。G 的子图的权是指子图的各边的权和。问题就是求赋权图G 中指定的两个顶点00,v u 间的具最小权的轨。这条轨叫做00,v u 间的最短路,它的权叫做00,v u 间的距离,亦记作),(00v u d 。 求最短路已有成熟的算法:迪克斯特拉(Dijkstra )算法,其基本思想是按距0u 从近到远为顺序,依次求得0u 到G 的各顶点的最短路和距离,直至0v (或直至G 的所有顶点),算法结束。为避免重复并保留每一步的计算信息,采用了标号算法。下面是该算法。 (i) 令0)(0=u l ,对0u v ≠,令∞=)(v l ,}{00u S =,0=i 。 (ii) 对每个i S v ∈(i i S V S \=),用 )}()(),({min uv w u l v l i S u +∈ 代替)(v l 。计算)}({min v l i S v ∈,把达到这个最小值的一个顶点记为1+i u ,令}{11++=i i i u S S 。 (iii). 若1||-=V i ,停止;若1||-

相关文档
最新文档