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

合集下载

利用Matlab编程计算最短途径及中位点选址

利用Matlab编程计算最短途径及中位点选址

§19. 利用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 iS u +∈代替)(v l 。

计算)}({min v l iS v ∈,把达到那个最小值的一个极点记为1+i u ,令}{11++=i i i u S S 。

(iii). 若1||-=V i ,停止;假设1||-<V i ,用1+i 代替i ,转(ii)。

算法终止时,从0u 到各极点v 的距离由v 的最后一次的标号)(v l 给出。

在v 进入i S 之前的标号)(v l 叫T 标号,v 进入i S 时的标号)(v l 叫P 标号。

算法确实是不断修改各项点的T 标号,直至取得P 标号。

假设在算法运行进程中,将每一极点取得P 标号所由来的边在图上标明,那么算法终止时,0u 至各项点的最短路也在图上标示出来了。

matlab最短路径案例

matlab最短路径案例

matlab最短路径案例在实际生活和工作中,我们经常会遇到需要找到最短路径的问题,例如在物流配送中,我们需要计算货物从出发地到目的地的最短路线,以提高效率和节约成本。

在这种情况下,MATLAB是一种非常有效的工具,可以帮助我们快速计算出最短路径。

最短路径问题是计算图中两个节点之间最短路径的问题。

在MATLAB中,我们可以使用Graph和Dijkstra算法来实现最短路径的计算。

首先,我们需要构建一个图,用来表示节点和边。

在MATLAB中,我们可以使用Graph对象来表示图,并且可以使用addnode和addedge函数来添加节点和边。

G = graph();G = addnode(G, 5); % 添加5个节点G = addedge(G, 1, 2, 10); % 添加边,每条边都有一个权重G = addedge(G, 1, 3, 15);G = addedge(G, 2, 3, 8);G = addedge(G, 2, 4, 2);G = addedge(G, 3, 4, 6);G = addedge(G, 4, 5, 12);上面的代码创建了一个图,其中包含5个节点和6条边。

每条边都有一个权重,代表两个节点之间的距离。

接下来,我们可以使用dijkstra函数来计算最短路径。

这个函数需要指定图、起始节点和目标节点。

[start_node, end_node, shortest_dist] = shortestpath(G, 1, 5);上面的代码计算了图G中从节点1到节点5的最短路径,并且返回了起始节点、终止节点和最短路径的长度。

最后,我们可以使用plot函数将最短路径可视化。

plot(G, 'EdgeLabel', G.Edges.Weight) % 可视化图highlight(G, shortest_path, 'EdgeColor', 'r') % 高亮显示最短路径通过以上步骤,我们可以使用MATLAB计算并可视化最短路径。

matlab dijkstra算法求解最短路径例题

matlab dijkstra算法求解最短路径例题

matlab dijkstra算法求解最短路径例题摘要:一、Dijkstra 算法简介1.Dijkstra 算法背景2.Dijkstra 算法原理二、MATLAB 实现Dijkstra 算法求解最短路径1.创建图对象2.计算最短路径3.可视化结果三、Dijkstra 算法应用示例1.例题描述2.解题步骤3.结果分析正文:一、Dijkstra 算法简介Dijkstra 算法是一种经典的图论算法,用于计算图中两个节点之间的最短路径。

它是由荷兰计算机科学家Edsger W.Dijkstra 于1956 年提出的,其基本思想是以起始点为中心向外层层扩展,直到扩展到终点为止。

Dijkstra 算法能得出最短路径的最优解,但由于它遍历计算的节点很多,所以效率低。

可以用堆优化来提高效率。

二、MATLAB 实现Dijkstra 算法求解最短路径1.创建图对象首先,我们需要使用MATLAB 的graph 函数创建一个图对象,指定节点和边的信息。

例如,我们创建一个简单的图,包含4 个节点和3 条边:```matlabG = graph(4, 3);```其中,4 表示图中有4 个节点,3 表示图中有3 条边。

2.计算最短路径接下来,我们可以使用MATLAB 的shortestpath 函数计算两个节点之间的最短路径。

例如,我们计算节点1 到节点3 的最短路径:```matlabSP = shortestpath(G, 1, 3);```3.可视化结果最后,我们可以使用MATLAB 的plot 函数将最短路径可视化。

例如,我们绘制节点和边以及最短路径:```matlabplot(G, SP);```三、Dijkstra 算法应用示例以下是一个使用Dijkstra 算法求解最短路径的例题:在一个图中,有4 个节点和3 条边,如下所示:```1 --2 -- 3| /| /| /| /|/4```请问,节点1 到节点4 的最短路径是多少?。

最短路dijkstra算法Matlab程序调用举例

最短路dijkstra算法Matlab程序调用举例

最短路dijkstra算法Matlab程序调用举例2014/4/17徐明华设赋权图如下图所示下述Matlab程序% test dijkstra's algorithm% The test example is take from the following book% Graph Theory with Applications by J. A. Bondy and U. S. R. Murty. % Page 16.clcs=1;t=5;flag=1;W=ones(11,11)*inf; %for i=1:11W(i,i)=0;endW(1,2)=2; W(2,1)=2;W(2,3)=1; W(3,2)=1;W(3,4)=2; W(4,3)=2;W(4,5)=9; W(5,4)=9;W(5,6)=4; W(6,5)=4;W(6,7)=1; W(7,6)=1;W(7,8)=9; W(8,7)=9;W(8,1)=1; W(1,8)=1;W(1,9)=8; W(9,1)=8;W(9,2)=6; W(2,9)=6;W(9,8)=7; W(8,9)=7;W(9,7)=2; W(7,9)=2;W(9,10)=1;W(10,9)=1;W(9,3)=5; W(3,9)=5;W(10,7)=4; W(7,10)=4;W(10,11)=6; W(11,10)=6;W(10,3)=3; W(3,10)=3;W(11,7)=3; W(7,11)=3;W(11,6)=1; W(6,11)=1;W(11,4)=7; W(4,11)=7;W(11,5)=2; W(5,11)=2;W(11,3)=9; W(3,11)=9;[c0,c,path0,path]=dijkstra(s,t,W,flag);c0path0调用matlab函数dijkstra(具体见本文库文档:最短路dijkstra算法Matlab程序), 可得到顶点v1 到顶点v5的最短路径path0及最短路径的长度c0如下:c0 = 13path0 = 1 2 3 10 9 7 6 11 5如果将上述程序中的语句flag=1;替换为flag=2;并将[c0,c,path0,path]=dijkstra(s,t,C,flag);c0path0替换为[c0,c,path0,path]=dijkstra(s,t,C,flag);cpath运行程序可得到顶点v1到图中其他各顶点的最短路径所成矩阵path和各最短路径的长度所成向量c,其中path的第i行表示v1到第i个顶点的最短路径,c(i) 为v1到第i个顶点的最短路径的长度。

matlab floyd最短路算法例题

matlab floyd最短路算法例题

matlab floyd最短路算法例题摘要:一、简介二、Floyd 算法的原理三、MATLAB 实现Floyd 最短路算法的例题四、Floyd 算法的适用范围和局限性五、总结正文:一、简介Floyd 算法是一种经典的动态规划算法,用于求解加权连通图中所有顶点之间的最短路径。

它可以处理有向图和无向图,同时也可以处理带有负权边的图。

Floyd 算法的时间复杂度为O(n^3),其中n 为图的顶点数。

二、Floyd 算法的原理Floyd 算法的核心思想是:对于任意两个顶点i 和j,我们可以通过若干个中间顶点k 来进行路径传递。

也就是说,从顶点i 到顶点j 的最短路径可能经过顶点k,也可能直接从顶点i 到顶点j。

因此,我们需要遍历所有可能的中间顶点k,检查从顶点i 到顶点k 再到顶点j 的路径是否比直接从顶点i 到顶点j 的路径更短。

如果成立,我们就更新从顶点i 到顶点j 的路径长度。

三、MATLAB 实现Floyd 最短路算法的例题以下是一个简单的MATLAB 实现Floyd 算法的例题:```matlab% 创建一个邻接矩阵表示的图A = [0, 1, 0, 0, 0;1, 0, 1, 0, 0;0, 1, 0, 1, 0;0, 0, 1, 0, 1;0, 0, 0, 1, 0];% 使用Floyd 算法计算最短路径dist = floyd(A);% 输出最短路径距离矩阵disp(dist);```在这个例题中,我们创建了一个5x5 的邻接矩阵A 来表示一个简单的图。

然后我们使用MATLAB 内置的floyd 函数来计算该图的所有顶点之间的最短路径。

最后,我们输出最短路径距离矩阵。

四、Floyd 算法的适用范围和局限性Floyd 算法适用于求解加权连通图中所有顶点之间的最短路径问题。

它尤其适用于处理有向图和无向图,同时也可以处理带有负权边的图。

然而,Floyd 算法不能用于构造最短路径,也不能用于计算带有负权回路的最短路径。

Matlab_Floyd算法求解最短路

Matlab_Floyd算法求解最短路

Matlab_Floyd算法求解最短路最短路问题(short-path problem)是⽹络理论解决的典型问题之⼀,可⽤来解决管路铺设、线路安装、⼚区布局和设备更新等实际问题。

基本内容是:若⽹络中的每条边都有⼀个数值(长度、成本、时间等),则找出两节点(通常是源节点和阱节点)之间总权和最⼩的路径就是最短路问题。

解决最短路问题的Floyd算法:Floyd算法:⼜称为插点法,是⼀种利⽤的思想寻找给定的中多源点之间的算法。

算法步骤:(1)从任意⼀条单边路径开始。

所有两点之间的距离是边的权,如果两点之间没有边相连,则权为⽆穷⼤。

(2)对于每⼀对顶点 u 和 v,看看是否存在⼀个顶点 w 使得从 u 到 w 再到 v ⽐已知的路径更短。

如果是,更新它。

把图⽤邻接矩阵G表⽰出来,如果从Vi到Vj有路可达,则G[i][j]=d,d表⽰该路的长度;否则G[i][j]=⽆穷⼤。

定义⼀个矩阵D⽤来记录所插⼊点的信息,D[i][j]表⽰从Vi到Vj需要经过的点,初始化D[i][j]=j。

把各个顶点插⼊图中,⽐较插点后的距离与原来的距离,G[i][j] = min( G[i][j], G[i][k]+G[k][j] ),如果G[i][j]的值变⼩,则D[i][j]=k。

在G中包含有两点之间最短道路的信息,⽽在D中则包含了最短通路径的信息。

例:已知有6个村⼦,相互间道路如图所⽰。

欲合建⼀所⼩学,已知A处有⼩学⽣50⼈,B处40⼈,C处60⼈,D处20⼈,E处70⼈,F处90⼈,问学校应建在哪个村⼦,使得学⽣上学最⽅便。

程序代码:(1)road函数的m⽂件:function minroad=road(u,s,begin_node,end_node)minroad=[];S=s;k=S(begin_node,end_node);if(k~=begin_node)&&(k~=end_node)minroad=[begin_node,k];endif(k==begin_node)||(k==end_node)fprintf('输⼊错误!');endwhile(k~=end_node)k=S(k,end_node);minroad=[minroad,k];endend(2)Floyd算法的m⽂件:d=[0 2 7 Inf Inf Inf2 0 4 6 8 Inf7 4 0 1 3 InfInf 6 1 0 1 6Inf 8 3 1 0 3Inf Inf Inf 6 3 0];n=length(d);U=d;S=zeros(n,n);for i=1:nfor j=1:nS(i,j)=j;endendfor i=1:nfor j=1:nfor m=1:nif U(i,j)>U(i,m)+U(m,j) S(i,j)=S(i,m);U(i,j)=U(i,m)+U(m,j);endendendendpeople=[50 40 60 20 70 90]; distance=[inf inf inf inf inf inf]; for i=1:ndistance(i)=U(i,:)*people';endSUpeopledistance[min_distance,village]=min(distance) begin_node=input('输⼊起始节点:begin=') end_node=input('输⼊终⽌节点:end=') minroad=road(U,S,begin_node,end_node)运⾏结果:>> FloydS =1 2 2 2 2 21 2 3 3 3 32 234 4 43 3 345 54 4 4 45 65 5 5 5 5 6U =0 2 6 7 8 112 0 4 5 6 96 4 0 1 2 57 5 1 0 1 48 6 2 1 0 311 9 5 4 3 0people =50 40 60 20 70 90distance =2130 1670 1070 1040 1050 1500 min_distance =1040village =4begin=1begin_node =1end=6end_node =6minroad =1 2 3 4 5 6综上所述,学校应建在D村,最短路为1040。

MATLAb最短路问题

MATLAb最短路问题
称 为 G 的 由 E 1 导 出 的 子 图 , 记 为 G [ E 1 ] .
[ { v 1 , v 4 , v 5 } ] [ { e 1 , e 2 , e 3 } ]
MATLAb最短路问题
返回
关联矩阵
对 无 向 图 G , 其 关 联 矩 阵 M = ( m i) j , 其 中 :
G 的图解如图.
MATLAb最短路问题
定义 在 图 G 中 , 与 V 中 的 有 序 偶 ( v i , v j ) 对 应 的 边 e , 称 为 图 的 有 向
边 ( 或 弧 ) , 而 与 V 中 顶 点 的 无 序 偶 v i v j相 对 应 的 边 e , 称 为 图 的 无 向 边 . 每 一 条 边 都 是 无 向 边 的 图 , 叫 无 向 图 ; 每 一 条 边 都 是 有 向 边 的 图 , 称 为 有 向 图 ; 既 有 无 向 边 又 有 有 向 边 的 图 称 为 混 合 图 .
则称w(P) w(e)为路径P的权. eE(P)
(2) 在赋权图G中,从顶点u到顶点v的具有最小权的路
P*(u,v),称为u到v的最短路.
MATLAb最短路问题
返回
固定起点的最短路
最短路是一条路径,且最短路的任一段也是最短路. 假设在u0-v0的最短路中只取一条,则从u0到其 余顶点的最短路将构成一棵以u0为根的树.
称为相邻的边. (4)边和它的端点称为互相关联的. (5)既没有环也没有平行边的图,称为简单图. (6)任意两顶点都相邻的简单图,称为完备图,记为Kn,其中n
为顶点的数目.
( 7)若V=X Y,X Y= ,X 中任两顶点不相邻,Y 中任两顶
点不相邻,称G为二元图;若X 中每一顶点皆与Y 中一切顶点 相邻,称为完备二元图,记为Km,n,其中m,n 分别为X 与Y 的顶 点数目.

图论中最短路问题的MATLAB程序实现[1]

图论中最短路问题的MATLAB程序实现[1]

安庆师范学院学报(自然科学版)2007年1问题的提出设G=(V,E)为连通图,顶点集为{1,2,3,…n},图中各边(i,j)有非负权cij(当(i,j)不是边时,权等于inf;当(i,j)是有向边时,cji与cij可以不相等),求一条道路使它是从顶点1到顶点n的所有道路中总权数最小的路,这就是图论中的最短路问题[1]。

解决这个问题至今公认最好的方法是1959年提出Di-jkstra算法,它用于计算一个点s到其他所有点的最短路。

此算法基本原理是:若某条路是最短路,这条路上的任意一段路也是连接这段路两个端点的最短路[1,2]。

2算法描述[3,4]第一步将点s标上永久性标记P(s)=0,表示从开始点s到达点s的最短距离是零。

第二步将其余的顶点标上T标记,T记号是试探性标记,点j的T标记T(j)分两部分,T(j)=T1(j)(T2(j)),第一部分T1(j)为从开始点s经过带P标记的点到达j点的最短路的权和,括号中T2(j)为第二部分,是这最短路中j点的前一点(如有多条最短路,则T2(j)可能有多值)。

不能经过带P标记的点到达的点的T1值是无穷大(用inf表示),T2是空集。

第三步若这些带有T标记中权和数T1最小的点是k,则点k是带P标记的点外与开始点s最近的点。

把点k的T标记改为P标记,如果权和数最小的点有多个,则把它们都改为P标记。

若点n不是P标记,转第二步(对带有T标记的点重新标记,直至点n为P标记为止)。

第四步追寻最短路,从终点n开始逆向逐次求最短路经过的点权和为P(n).从算法直接可见所得到的路是最短路。

上述算法更具体的步骤如下:不妨设开始点的标号是1。

⑴设N=0,P(1)=0,其余各点都是T标记,T1值为无穷大,T2值为空集。

⑵若vi点为刚成为P标记的(一个或几个)点,将所有与这些vi相邻的带有T标记的点vj的T标记的值改为;若T1(vj,N+1)=P(vi)+cij,则T2(vj,N+1)=vi,若T1(vj,N+1)=T1(vj,N),则T2(vj,N+1)=T2(vj,N),(因此T2可能是多值的)。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

用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,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。

相关文档
最新文档