Floyd算法 计算最短距离矩阵和路由矩阵 查询最短距离和路由 matlab实验报告
matlab的floyd算法

matlab的floyd算法Floyd算法,是一种图论算法,用于在加权图中求解最短路径。
它是以发明者之一、罗伯特·弗洛伊德的名字命名的。
这个算法同样被用于对于任意两点之间的最长路径(所谓的最短路径问题)进行求解。
算法描述给定一个带权的有向图G=(V,E),其权值函数为w,下面我们定义从顶点i到顶点j的路径经过的最大权值为dist(i,j)。
特别地,当i=j时,dist(i,j)=0。
为了方便描述算法,我们用D(k,i,j)表示从顶点i到顶点j且路径中的所有顶点都在集合{1,2,⋯,k}中的所有路径中,最大边权值的最小值。
则从顶点i到顶点j的最短路径的边权值就是 D(n,i,j),其中n是图中顶点的数量。
算法思想:建立中间顶点集合算法是通过不断地扩充中间顶点集合S,来求解任意两点之间的最短路径。
具体来说,设S={1, 2, ⋯, k},其中k是整数。
Floyd算法的基本思想是,依次考察所有可能的中间顶点x(即所有S中的顶点),对于每个中间顶点x,若从i到x再到j的路径比已知的路径更短,则更新dist(i,j)为更小的值D(k,i,j)。
最终,在S={1, 2, ⋯, n}的情况下,所得到的D(n,i,j)就是顶点i到顶点j之间的最短路径的长度。
Floyd算法的核心是一个三重循环,在每一轮循环中,枚举S中所有的中间顶点x,通过动态规划计算出从i到j的最短路径长度D(k,i,j)。
这一过程可表述为:for k = 1 to nfor i = 1 to nfor j = 1 to nif D(k,i)+D(j,k) < D(k,i,j)D(k,i,j) = D(k,i)+D(j,k)其中D(0,i,j)即为dist(i,j),若i和j不连通,则D(0,i,j)=+Inf。
算法实现function D = Floyd(adjmat)% adjmat为邻接矩阵邻接矩阵adjmat的定义为:- 若两个顶点之间有边相连,则对应位置为该边的边权值;- 若两个顶点之间没有边相连,则对应位置为0。
Dijkstra、Floyd算法Matlab_Lingo实现

Dijkstra算法Matlab实现。
%求一个点到其他各点的最短路径function [min,path]=dijkstra(w,start,terminal)%W是邻接矩阵%start是起始点Array %terminal是终止点%min是最短路径长度%path是最短路径n=size(w,1);label(start)=0;f(start)=start;for i=1:nif i~=startlabel(i)=inf;endends(1)=start;u=start;while length(s)<nfor i=1:nins=0;forif i==s(j)ins=1;endendif ins==0v=i;if label(v)>(label(u)+w(u,v))label(v)=(label(u)+w(u,v));f(v)=u;endendendv1=0;k=inf;for i=1:nins=0;for j=1:length(s)if i==s(j)ins=1;endend-if ins==0v=i;if k>label(v)k=label(v);v1=v;endendends(length(s)+1)=v1;u=v1;endmin=label(terminal);path(1)=terminal;i=1;while path(i)~=startpath(i+1)=f(path(i));i=i+1 ;endpath(i)=start;L=length(path);path=path(L:-1:1);Floyd算法:matlab程序:%floyd算法,function [D,path,min1,path1]=floyd(a,start,terminal)%a是邻接矩阵%start是起始点%terminal是终止点%D是最小权值表D=a;n=size(D,1);path=zeros(n,n);for i=1:nfor j=1:nif D(i,j)~=infpath(i,j)=j;endendendfor k=1:nfor i=1:nfor j=1:nif D(i,k)+D(k,j)<D(i,j)-D(i,j)=D(i,k)+D(k,j);path(i,j)=path(i,k);endendendendif nargin==3min1=D(start,terminal);m(1)=start;i=1;path1=[ ];while path(m(i),terminal)~=terminalk=i+1;m(k)=path(m(i),terminal);i=i+1;endm(i+1)=terminal;path1=m;end1 6 5 5 5 66 2 3 4 4 65 2 3 4 5 45 2 3 4 5 61 4 3 4 5 11 2 4 4 1 6Floyd算法:Lingo程序:!用LINGO11.0编写的FLOYD算法如下;model:sets:nodes/c1..c6/;link(nodes,nodes):w,path; !path标志最短路径上走过的顶点;endsetsdata:path=0;w=0;@text(mydata1.txt)=@writefor(nodes(i):@writefor(nodes(j):-@format(w(i,j),' 10.0f')),@newline(1));@text(mydata1.txt)=@write(@newline(1));@text(mydata1.txt)=@writefor(nodes(i):@writefor(nodes(j):@format(path(i,j),' 10.0f')),@newline(1));enddatacalc:w(1,2)=50;w(1,4)=40;w(1,5)=25;w(1,6)=10;w(2,3)=15;w(2,4)=20;w(2,6)=25;w(3,4)=10;w(3,5)=20;w(4,5)=10;w(4,6)=25;w(5,6)=55;@for(link(i,j):w(i,j)=w(i,j)+w(j,i));@for(link(i,j) |i#ne#j:w(i,j)=@if(w(i,j)#eq#0,10000,w(i,j)));@for(nodes(k):@for(nodes(i):@for(nodes(j):tm=@smin(w(i,j),w(i,k)+w(k,j));path(i,j)=@if(w(i,j)#gt# tm,k,path(i,j));w(i,j)=tm)));endcalcend无向图的最短路问题Lingomodel:sets:cities/1..5/;roads(cities,cities):w,x;endsetsdata:w=0;enddatacalc:w(1,2)=41;w(1,3)=59;w(1,4)=189;w(1,5)=81;w(2,3)=27;w(2,4)=238;w(2,5)=94;w(3,4)=212;w(3,5)=89;w(4,5)=171;@for(roads(i,j):w(i,j)=w(i,j)+w(j,i));@for(roads(i,j):w(i,j)=@if(w(i,j) #eq# 0, 1000,w(i,j)));endcalcn=@size(cities); !城市的个数;min=@sum(roads:w*x);@for(cities(i)|i #ne#1 #and# i #ne#n:@sum(cities(j):x(i,j))=@sum(cities(j):x(j,i)));@sum(cities(j):x(1,j))=1;-@sum(cities(j):x(j,1))=0; !不能回到顶点1;@sum(cities(j):x(j,n))=1;@for(roads:@bin(x));endLingo编的sets:dian/a b1 b2 c1 c2 c3 d/:;link(dian,dian)/a,b1 a,b2 b1,c1 b1,c2 b1,c3 b2,c1 b2,c2 b2,c3 c1,d c2,d c3,d/:x,w;endsetsdata:w=2 4 3 3 1 2 3 1 1 3 4;enddatamin=@sum(link:w*x);@for(link:@bin(x));n=@size(dian);@sum(link(i,j)|i#eq#1:x(i,j))=1;@sum(link(j,i)|i#eq#n:x(j,i))=1;@for(dian(k)|k#ne#1#and#k#ne#n:@sum(link(i,k):x(i,k))=@sum(link(k,i):x(k,i)));- sets:dian/1..5/:level; !level(i)表示点i的水平,用来防止生产圈;link(dian,dian):d,x;endsetsdata:d=0 41 59 189 8141 0 27 238 9459 27 0 212 89189 238 212 0 17181 94 89 171 0;enddatan=@size(dian);min=@sum(link(i,j)|i#ne#j:d(i,j)*x(i,j));@sum(dian(j)|j#gt#1:x(1,j))>1;@for(dian(i)|i#gt#1:@sum(dian(j)|j#ne#i:x(j,i))=1);@for(dian(i)|i#gt#1:@for(dian(j)|j#ne#i#and#j#gt#1:level(j)>level(i)+x(i,j)-(n-2)*(1-x(i,j))+(n-3)*x(j, i)));@for(dian(i)|i#gt#1:level(i)<n-1-(n-2)*x(1,i));@for(dian(i)|i#gt#1:@bnd(1,level(i),100000));@for(link:@bin(x));。
matlab弗洛伊德算法求出最短距离

最短路径Floyd算法
Floyd算法是一种用于解决最短路径问题的动态规划算法,其时间复杂度为O(n^3 )。
Floyd算法可以求出任意两点之间的最短路径,并且可以处理负权边(但不能处理负权环)。
算法思想
Floyd算法的基本思想是:对于图中的每一对顶点i和j,看看是否存在一个顶点k,使得从i 到k 再到j 比已知的路径更短。
如果是更短的,就修改当前路径为更短的那个路径。
算法步骤
1.初始化:将图中任意两点之间的最短路径长度初始化为它们之间的权值,如果两点之间没有直接的边,则权值为∞。
2.对于每一个中间节点k,依次考察所有的节点对(i,j),如果从i到j经过节点k比原来的路径更短,则更新最短路径长度。
3.最后得到的矩阵即为任意两点之间的最短路径长度。
Matlab代码
function [D,P] = floyd(W)
% W为邻接矩阵
% D为最短距离矩阵
% P为最短路径矩阵
n = size(W,1);
for k=1:n
for i=1:n
for j=1:n
if W(i,k)+W(k,j)<W(i,j)
W(i,j)=W(i,k)+W(k,j);
P(i,j)=k;
end
end
end
end。
floyd算法求解邻接矩阵的最短距离矩阵

文章编号:001主题:探讨floyd算法求解邻接矩阵的最短距离矩阵在计算机算法中,图论一直是一个重要的研究领域。
而其中,最短路径算法一直是图论中的热门话题之一。
在众多的最短路径算法中,floyd算法因其简洁高效的特点而备受青睐。
本文将深入探讨floyd算法在求解邻接矩阵的最短距离矩阵中的应用,并分析其实现原理及优缺点。
一、floyd算法简介Floyd算法是一种用于寻找加权图中顶点之间最短路径的动态规划算法。
它的基本思想是每次引入一个新的顶点,看看这个新顶点能不能对原来两个顶点之间的距离产生改变,如果可能,就进行更新。
通过多次迭代,最终得到所有顶点之间的最短路径。
二、floyd算法的实现步骤1. 初始化邻接矩阵在使用floyd算法求解最短路径时,首先需要初始化邻接矩阵。
邻接矩阵的每个元素代表图中两个顶点之间的距禋,如果两个顶点之间没有直接连接,则距离设为无穷大。
如果两个顶点直接相连,则距离设为两个顶点之间的权值。
2. 动态规划求解最短路径接下来,利用动态规划的思想,通过逐渐引入新的顶点,不断更新已有的最短路径。
具体做法是,对于每对顶点i和j,检查它们之间是否存在顶点k,使得从i到j的最短路径可以经过顶点k。
如果存在这样的顶点k,那么更新i到j的最短路径为i到k和k到j的距离之间的较小值。
3. 递推过程重复上述步骤,通过逐渐引入新的顶点k,直到遍历完所有顶点,就可以得到最终的最短距离矩阵。
三、floyd算法的优缺点1. 优点floyd算法可以求解任意两点之间的最短路径,且适用于有向图和无向图。
并且可以方便地求出最短路径的具体路径。
算法简单易懂,实现起来也比较容易。
2. 缺点floyd算法的时间复杂度较高,为O(n^3),当n较大时,计算量会非常庞大。
另外,在处理稀疏图时,可能会造成大量的计算浪费,因为floyd算法会对所有的顶点对进行遍历,而对于稀疏图来说,很多顶点对之间并不存在直接连接的边。
四、个人观点和理解在实际应用中,floyd算法通常适用于节点数量不是特别大,但边的数量非常大或者需要求解任意两点之间最短路径的情况。
最短路径算法matlab代码

最短路径算法matlab代码最短路径算法是计算两点之间最短路程的算法。
这个问题可以转化为图论中的最短路径问题,目前有多种解法,其中比较常用的就是迪杰斯特拉算法和弗洛伊德算法。
本文将以迪杰斯特拉算法为例,介绍一下最短路径算法的matlab实现。
迪杰斯特拉算法迪杰斯特拉算法是用来解决有向带权图中单源最短路径问题的一种贪心算法。
该算法通过维护一个距离集合,逐步扩展最短路径,直至到达终点或者所有路径均已扩展完毕。
具体算法流程如下:1. 初始化距离集合,将距离集合中除起点外所有点的距离设置为无穷大,将起点的距离设置为0。
2. 从距离集合中选择距离最小的点v,将v加入已扩展集合中。
3. 遍历v的所有邻居节点,将v到邻居节点的距离d与邻居节点原有的距离比较,若d小于原有距离,则将邻居节点的距离更新为d。
4. 重复以上步骤,直至所有点均已加入已扩展集合中。
matlab代码实现在matlab中实现迪杰斯特拉算法,需要用到矩阵来描述整个图。
用一个N*N的矩阵表示图中各节点之间的距离,例如:```G = [ 0, 4, 2, Inf, Inf;Inf, 0, 1, 5, Inf;Inf, Inf, 0, Inf, 3;Inf, Inf, Inf, 0, 1;Inf, Inf, Inf, Inf, 0 ];```其中Inf表示节点间没有连接。
然后,将距离集合D初始化为一个1*N 的向量,D(i)表示起点到节点i的距离。
对于起点,其距离应该为0。
```D = [0 Inf Inf Inf Inf];```接下来,用一个1*N的向量S来表示已经扩展过的节点。
一开始,S 中只有起点。
```S = [1];```接下来就可以实现算法了。
迭代遍历S中的所有节点,更新其邻居节点的距离,然后将距离最小的邻居节点加入S中。
具体实现代码如下:```for i = 1:N-1minDis = Inf;for j = 1:Nif ~ismember(j, S) % 如果节点j不在已扩展集合中if D(j) < minDisu = j;minDis = D(j);endendendS = [S u];for v = 1:Nif ~ismember(v, S) % 如果节点v不在已扩展集合中if G(u, v) ~= Inf % 如果u和v之间存在连接if D(u) + G(u, v) < D(v) % 如果从起点到u节点再到v节点的距离小于v原有距离D(v) = D(u) + G(u, v); % 更新v的距离endendendendend```完整代码将上述代码整合成一个函数,得到完整的matlab代码实现。
floyd算法matlab代码

function [D,R]=floyd(a)% a=[3 2;4 6];采用floyd算法计算图a中每对顶点最短路% a=[0 4 11;6 0 2;3 inf 0];n=size(a,1);D=a % D是距离矩阵for i=1:nfor j=1:nR(i,j)=j;endendR % R是路由矩阵for k=1:nfor i=1:nfor j=1:nif D(i,k)+D(k,j)<D(i,j)D(i,j)=D(i,k)+D(k,j);R(i,j)=R(i,k);endendendkDRend••••••••••••••••••【唯美句子】走累的时候,我就到升国旗哪里的一角台阶坐下,双手抚膝,再闭眼,让心灵受到阳光的洗涤。
懒洋洋的幸福。
顶 3 收藏 2•【唯美句子】一个人踮着脚尖,在窄窄的跑道白线上走,走到很远的地方又走回来。
阳光很好,温暖,柔和。
漫天的安静。
顶7 收藏7•【唯美句子】清风飘然,秋水缓淌。
一丝云起,一片叶落,剔透生命的空灵。
轻轻用手触摸,就点碎了河面的脸。
落叶舞步婀娜不肯去,是眷恋,是装点?瞬间回眸,点亮了生命精彩。
顶11 收藏9•【唯美句子】几只从南方归来的燕子,轻盈的飞来飞去,“几处早莺争暖树,谁家新燕啄春泥,”其乐融融的山林气息,与世无争的世外桃源,让人心旷神怡。
顶0 收藏 2•【唯美句子】流年清浅,岁月轮转,或许是冬天太过漫长,当一夜春风吹开万里柳时,心情也似乎开朗了许多,在一个风轻云淡的早晨,踏着初春的阳光,漫步在碧柳垂青的小河边,看小河的流水因为解开了冰冻而欢快的流淌,清澈见底的的河水,可以数得清河底的鹅软石,偶尔掠过水面的水鸟,让小河荡起一层层的涟漪。
河岸换上绿色的新装,刚刚睡醒的各种各样的花花草草,悄悄的露出了嫩芽,这儿一丛,那儿一簇,好像是交头接耳的议论着些什么,又好象是在偷偷地说着悄悄话。
顶 3 收藏 4•【唯美句子】喜欢海子写的面朝大海春暖花开,不仅仅是因为我喜欢看海,还喜欢诗人笔下的意境,每当夜深人静时,放一曲纯音乐,品一盏茶,在脑海中搜寻诗中的恬淡闲适。
matlab中求最短路径的函数

matlab中求最短路径的函数在matlab中,有多种方法可以求解最短路径问题。
其中,较为常用的方法包括Dijkstra算法、Bellman-Ford算法和Floyd算法等。
这些方法对应的函数分别为dijkstra、bellmanford和floyd。
以下是这些函数的使用方法:1. dijkstra函数dijkstra函数可以求解带权有向图的单源最短路径问题。
其使用方法如下:[d,path] = dijkstra(W,s,t)其中,W为带权邻接矩阵,s为源节点,t为目标节点。
函数返回最短路径长度d和路径path。
例如,假设有以下带权有向图:W = [0 1 12 0;0 0 9 3;0 0 0 0;0 0 4 0];其中,0表示两节点之间没有边相连。
则可以使用以下代码求解1号节点到4号节点的最短路径:[d,path] = dijkstra(W,1,4)最短路径长度为7,路径为[1 2 4]。
2. bellmanford函数bellmanford函数可以求解带权有向图的单源最短路径问题,但是可以处理负权边。
其使用方法如下:[d,path] = bellmanford(W,s,t)其中,W为带权邻接矩阵,s为源节点,t为目标节点。
函数返回最短路径长度d和路径path。
例如,假设有以下带权有向图:W = [0 1 12 0;-4 0 9 3;0 0 0 0;0 0 4 0];其中,负权边被用负数表示。
则可以使用以下代码求解1号节点到4号节点的最短路径:[d,path] = bellmanford(W,1,4)最短路径长度为-1,路径为[1 2 4]。
3. floyd函数floyd函数可以求解带权有向图的所有节点之间的最短路径问题。
其使用方法如下:[D,path] = floyd(W)其中,W为带权邻接矩阵。
函数返回最短路径长度矩阵D和路径矩阵path。
例如,假设有以下带权有向图:W = [0 1 12 0;0 0 9 3;0 0 0 0;0 0 4 0];则可以使用以下代码求解所有节点之间的最短路径:[D,path] = floyd(W)最短路径长度矩阵为:D = [0 1 10 4;Inf 0 9 3;Inf Inf 0 Inf;Inf Inf 4 0];其中,Inf表示两节点之间不存在路径。
Floyd最短路算法的MATLAB程序

Floyd最短路算法的MATLAB程序Floyd最短路算法的MATLAB程序2006-08-17 20:14%floyd.m%采用floyd算法计算图a中每对顶点最短路 %d是矩离矩阵%r是路由矩阵function [d,r]=floyd(a)n=size(a,1);d=a;for i=1:nfor j=1:nr(i,j)=j;endendrfor k=1:nfor i=1:nfor j=1:nif d(i,k)+d(k,j)<d(i,j)< p="">d(i,j)=d(i,k)+d(k,j); r(i,j)=r(i,k)endendendkdrendvoid Dijkstral(int v0){int i;bool s[MAX_VEX];for(i=0;i<dim;i++)< p="">{d[v0][i]=map[v0][i];s[i]=false;if((i!=0)&&(d[v0][i]<inf))< p="">p[v0][i]=v0;elsep[v0][i]=-1;}s[v0]=true;d[v0][v0]=0;for(i=0;i<dim;i++)< p="">{double min=INF;int u=v0;for(int j=0;j<dim;j++)< p="">if(!s[j]&&d[v0][j]<min)< p="">{u=j;min=d[v0][j];}s[u]=true;for(int w=0;w<dim;w++)< p="">{if((!s[w])&&(d[v0][w]>d[v0][u]+map[u][w])) {d[v0][w]=d[v0][u]+map[u][w];p[v0][w]=u;}}}}Justin Hou介绍寻找最有价值路径(c语言)描述:从上(入口)往下行走,直到最下节点(出口)结束,将所经节点上的数值相加,要求找到一条最有价值路径(既是路径总数值最大)并输出总数值。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
function [w r] = func1(w) n=length(w); x = w; r = zeros(n,1);%路由矩阵的初始化 for i=1:1:n for j=1:1:n if x(i,j)==inf r(i,j)=0; else r(i,j)=j; end, end end; %迭代求出k次w值 for k=1:n a=w; s = w; for i=1:n for j=1:n w(i,j)=min(s(i,j),s(i,k)+s(k,j)); end end %根据k-1次值和k次w值求出k次r值 for i=1:n for j=1:n if i==j r(i,j)=0; elseif w(i,j)<a(i,j) r(i,j)=r(i,k); else r(i,j)=r(i,j); end end end end;
end P; 【m1.m】 w1=[0 100 100 1.2 9.2 100 0.5; 100 0 100 5 100 3.1 2; 100 100 0 100 100 4 1.5; 1.2 5 100 0 6.7 100 100; 9.2 100 100 6.7 0 15.6 100; 100 3.1 4 100 15.6 0 100; 0.5 2 1.5 100 100 100 0]; w2=[0 0.5 2 1.5 100 100 100; 0.5 0 100 100 1.2 9.2 100; 2 100 0 100 5 100 3.1; 1.5 100 100 0 100 100 4; 100 1.2 5 100 0 6.7 100; 100 9.2 100 100 6.7 0 15.6; 100 100 3.1 4 100 15.6 0]; [W1 R1] = func1(w1) [W2 R2] = func1(w2) 【m2.m】 w=input('输入权值矩阵w='); k1=input('输入端点1:k1='); k2=input('输入端点2:k2='); w [W R] = func1(w) [P u]=func4(w,k1,k2); disp(['k1、k2间最短路:',num2str(P)]); disp(['k1、k2间最短距离:',num2str(u)]);
2. 算法的流程图
Floyd算法: 结束 开始 (k) (k-1) Wi,j =min(Wi,j ,Wik(k -1) + Wkj(k -1)) n=length(w) k=0 k≤n? Wi,j(k)<Wi,j(k-1)? Wi,j(k)≤Wi,j(k-1)? Yes ri,j(k)= ri,j(k-1) No (k) ri,j = ri,k(k-1) Yes
P1(k) = k2; V = ones(1,n) * 100; kk = k2; while kk~=k1 for i = 1:n V(1,i) = U(k1,kk) - w(i,kk); if V(1,i) == U(k1,i) P1(k+1)=i; kk=i; k=k+1; end end end k=1; wrow = find(P1~=0); for j=length(wrow):(-1):1 P(k) = P1(wrow(j)); k=k+1; end P;
F1:已求得W(k-1)和R(k-1),依据下面的迭代求W(k)和R(k)
F2:若k≤n,重复F1;若k>n,终止。
>
三、实验内容 1、用MATLAB 仿真工具实现Floyd 算法:给定图G 及其边(i , j )的权 wi , j (1≤i≤n ,1≤j≤n) ,求出其各个端点之间的最小距离以及路由。 (1)尽可能用M 函数分别实现算法的关键部分,用M 脚本来进行算法 结 果验证; (2)分别用以下两个初始距离矩阵表示的图进行算法验证:
七、遇到的问题及解决方法
(1) 图的等价表示方法; (2) 两点间的最短路径查询算法。
八、实验心得
通过本次实验实现了用计算机语言编写Floys本掌握了算法的实现方 法,对MatLab编程语言更加熟悉,培养了算法设计与优化能力。此次实 验我受益匪浅。
五、数据结构
1.主要函数
最短距离、路由函数: function [w r] = func1(w) n=length(w); x = w; r = zeros(n,1);%路由矩阵的初始化
for i=1:1:n for j=1:1:n if x(i,j)==100 r(i,j)=0; else r(i,j)=j; end, end end; %迭代求出k次w值 for k=1:n a=w; s = w; for i=1:n for j=1:n w(i,j)=min(s(i,j),s(i,k)+s(k,j)); end end %根据k-1次值和k次w值求出k次r值 for i=1:n for j=1:n if i==j r(i,j)=0; elseif w(i,j)<a(i,j) r(i,j)=r(i,k); else r(i,j)=r(i,j); end end end end; 最短路径函数: function [P u]=func2(w,k1,k2) n = length(w); U = w; m = 1; while m <= n for i = 1:n; for j = 1:n; if U(i,j)>U(i,m) + U(m,j) U(i,j) = U(i,m) + U(m,j); end end end m = m + 1; end u = U(k1,k2); P1=zeros(1,n); k = 1;
实验四:Floyd 算法
一、实验目的 利用MATLAB 实现Floyd 算法,可对输入的邻接距离矩阵计算图中任 意两点间的最短距离矩阵和路由矩阵,且能查询任意两点间的最短距离 和路由。 二、实验原理 Floyd 算法适用于求解网络中的任意两点间的最短路径:通过图的 权值矩阵求出任意两点间的最短距离矩阵和路由矩阵。优点是容易理 解,可以算出任意两个节点之间最短距离的算法,且程序容易实现,缺 点是复杂度达到,不适合计算大量数据。 Floyd 算法可描述如下: 给定图G 及其边(i , j )的权wi, j (1≤i≤n ,1≤j≤n) F0:初始化距离矩阵W(0)和路由矩阵R(0)。其中:
【func2.m】 function [P u]=func2(w,k1,k2) n = length(w); U = w; m = 1; while m <= n for i = 1:n; for j = 1:n; if U(i,j)>U(i,m) + U(m,j) U(i,j) = U(i,m) + U(m,j); end end end m = m + 1; end u = U(k1,k2); P1=zeros(1,n); k = 1; P1(k) = k2; V = ones(1,n) * 100; kk = k2; while kk~=k1 for i = 1:n V(1,i) = U(k1,kk) - w(i,kk); if V(1,i) == U(k1,i) P1(k+1)=i; kk=i; k=k+1; end end end k=1; wrow = find(P1~=0); for j=length(wrow):(-1):1 P(k) = P1(wrow(j)); k=k+1;
六、实验结论与分析
通过上图可知,V4和V6之间最短距离是6.8,最短路由是V4—>V1—>V7 —>V2—>V6,3和V4之间最短距离是3.2,最短路由是V3—>V7—>V1— >V4
通过上图可知,,点对V1和V7之间最短距离是5.1,最短路由是V1—>V3 —>V7 端点对V3和V5之间最短距离是3.7,最短路由是V3—>V1—>V2—>V5 端点对V1和V6之间最短距离是8.4,最短路由是V1—>V2—>V5—>V6
分别求出W(7)和R(7)。 2、根据最短路由矩阵查询任意两点间的最短距离和路由 (1)最短距离可以从最短距离矩阵的ω(i,j)中直接得出; (2)相应的路由则可以通过在路由矩阵中查找得出。由于该程序中使 用的是前向矩阵,因此在查找的过程中,路由矩阵中r(i,j)对应的值为Vi 到Vj 路由上的下一个端点,这样再代入r(r(i,j),j),可得到下下个端点,由 此不断循环下去, 即可找到最终的路由。 (3)对图1,分别以端点对V4 和V6, V3 和V4 为例,求其最短距离和路 由; 对图2,分别以端点对V1 和V7,V3 和V5,V1 和V6 为例,求其最 短距离和路由。 3、输入一邻接权值矩阵,求解最短距离和路由矩阵,及某些点间的最 短路径。