最短路dijkstra算法Matlab程序

合集下载

Dijkstra求最短路的MATLAB程序(含注释)

Dijkstra求最短路的MATLAB程序(含注释)

Dijkstra求解最短路(含注释)function [P,D]=dijkstra_pt(A,sv)%Dijkstra法求解最短路%A为邻接矩阵;%sv为寻求最短路的起始点%P为所有点的P标号,即路权值%D为sv到所有结点的最短路径矩阵%2010年8月28日凌晨1:41[n,n]=size(A);s=sv;T=inf.*ones(1,n);%T标号初始化P=inf.*ones(1,n);%P标号初始化Tv=1:1:n;%具有T标号的点,初始时,所有点均为T标号v=zeros(1,n);%结点的前驱,初始时,均为0Tm=zeros(n,n);%所有点从P标号变为T标号的过程矩阵P(s)=0;for i=1:n%将所有结点从P标号变为T标号的过程Pv(i)=s;%Pv具有P标号的结点Tv=Tmark(Tv,s);%删去具有P标号的结点Tm(s,:)=A(s,:);for k=Pv%将具有P标号的点赋值无穷大,从而不影响后面的程序取最小值Tm(s,k)=inf;T(k)=inf;endfor k=Tv%一次修改P标号点所对应的T标号点的T标号Tm(s,k)=Tm(s,k)+P(s);endfor k=Tv[x,val]=min([T(k),Tm(s,k)]);T(k)=x;%二次修改P标号点所对应的T标号点的T标号if val==2v(k)=s;%修改P标号点所对应的T标号点的前驱endend[x,val]=min(T);%寻找P标号点if x==infbreak;ends=val;P(s)=x;%修改P标号end%下面求解从sv到各点的最短路矩阵aad=zeros(1,n);%最短路临时存储向量for i=n:-1:1w=i;for k=1:n%将sv到i点的最短路倒序存储在aad中if w==0break;endaad(k)=w;w=v(w);if w==svaad(k+1)=w;break;endendfor l=1:n%将sv到i点的最短路顺序存储在D中if aad(l)==svk=1;for j=l:-1:1D(i,k)=aad(j);k=k+1;endendendaad=zeros(1,n);end[g,h]=size(D);for i=1:g%将与最短路径无关的点赋值NaNfor j=1:h%con由上面计算得到if D(i,j)==0D(i,j)=NaN;endendend%下面为在T标号结点集合中删除P标号的子函数function Tvad=Tmark(Tv,vm)tg=length(Tv);for i=1:tgif Tv(i)==vm;wd=i;break;endendTvad=[Tv(1,1:wd-1),Tv(1,wd+1:tg)];。

Dijkstra 算法的 Matlab 实现

Dijkstra 算法的 Matlab 实现

Dijkstra 算法的 Matlab 实现Glorevo©在学习了 Dijkstra 算法之后,发现书上那堆代码写得跟坨*一样,越看越恶心,强忍着看了一半,放弃了,干脆自己写吧!function [D I] = dijkstra(W,k)% Dijkstra 算法—— by Glorevo% 找出赋权图第 k 个顶点到其余各个顶点的最小权以及最短路% W 为带权邻接矩阵% 返回值 D 为最小权,I 为最短路n = size(W,1); % 顶点个数V = 1:n; % 初始化待作为终点的顶点向量V(k) = 0; % 0 表示不再作为终点temp = k; % 当前插入顶点D(1:n) = inf; % 初始化最小权向量D(k) = 0; % 顶点 V(k) 到本身的权为 0I(1:n) = k; % 初始化最短路向量while sum(V) > 0 % 尚存在可作为终点的顶点,则继续迭代v = find(V~=0); % v 是可作为终点的顶点向量,用作循环变量的取值范围for i = v % 分别以 v 中所有的顶点作为终点,插入一个顶点 tempif D(i) > D(temp)+W(temp,i) % 判断是否比之前更优D(i) = D(temp)+W(temp,i); % 保存更小权,更新最小权向量 I(i) = temp; % 修改当前路径的终点的前驱endend%在可作为终点的顶点向量 v 中找到当前使 D 最小的顶点curmin = find(D==min(D(v)));for j = 1:length(curmin) % 因为以上找到的顶点可能有多个,这里只取一个if(any(curmin(j)==v))%不能直接用 temp=curmin(1) 或者 temp=curmin(2) 之类的表达% 因为 curmin(1)等可能只是 D 却不是 v 的一个合法索引! temp = curmin(j);break; % 将当前使 D 最小的顶点作为下次迭代的插入顶点endendV(temp) = 0; % 将当前使 D 最小的顶点标记为不可再作为终点end。

matlab中求最短路径的函数

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表示两节点之间不存在路径。

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计算并可视化最短路径。

实验三 Dijkstra最短路算法的程序仿真1

实验三  Dijkstra最短路算法的程序仿真1

实验三Dijkstra最短路算法的程序仿真实验目的:●了解IP核心网中OSPF路由协议核心算法的实现原理●掌握matlab编程,实现Dijkstra最短路算法的应用实验要求:●掌握Dijkstra算法●掌握matlab语言对于最短路仿真的功能实验场景:实验参考程序:function [l,z]=Dijkstra_a(W)% Dijkstra算法% 输入W表示连接矩阵% 输出l表示参考点的最小距离,DD表示最短路径生成树n = size (W,1);for i = 1 :nl(i)=W(1,i);z(i)=1;endi=1;while i<=nfor j =1 :nif l(i)>l(j)+W(j,i)l(i)=l(j)+W(j,i);z(i)=j;if j<iif j~=1i=j-1;elsei=1;endendendendi=i+1;end任务:(1)按网络拓扑图给出连接矩阵,例如连接矩阵为W = [0 1 Inf 2; 1 0 2 Inf; Inf 2 0 4; 2 Inf 4 Inf];请按照上例给出场景中的连接矩阵(2)计算场景中R1到各路由器的最短距离;(3)设计一个9点的网络拓扑图,计算每个路由器到其它路由器的所有最短路径。

按此文档格式编写实验报告,写出完成步骤的实现和代码,以及相应结果图,完成电子版,然后打印出来,贴到实验报告册。

实验小结通过Dijkstra最短路算法的程序仿真实验的学习,增强了我对Dijkstra最短路算法的了解,能够看懂图形,并能写出连接矩阵W,再通过MATLAB得出1和z,由z画出树状图。

总之,这次实验加深了对Dijkstra最短路算法的应用的了解和运用,体验到了自己画图并计算每个路由器到其它路由器的所有最短路径的乐趣。

D_i_j_k_s_t_r_a最短路算法MATLAB程序_

D_i_j_k_s_t_r_a最短路算法MATLAB程序_

从起点sb到终点db通用的Dijkstra标号算法程序function [mydistance,mypath]=mydijkstra(a,sb,db);% 输入:a—邻接矩阵,a(i,j)是指i到j之间的距离,可以是有向的% sb—起点的标号, db—终点的标号% 输出:mydistance—最短路的距离, mypath—最短路的路径n=size(a,1); visited(1:n) = 0;distance(1:n) = inf; distance(sb) = 0; %起点到各顶点距离的初始化visited(sb)=1; u=sb; %u为最新的P标号顶点parent(1:n) = 0; %前驱顶点的初始化for i = 1: n-1id=find(visited==0); %查找未标号的顶点for v = idif a(u, v) + distance(u) < distance(v)distance(v) = distance(u) + a(u, v); %修改标号值parent(v) = u;endendtemp=distance;temp(visited==1)=inf; %已标号点的距离换成无穷[t, u] = min(temp); %找标号值最小的顶点visited(u) = 1; %标记已经标号的顶点endmypath = [];if parent(db) ~= 0 %如果存在路!t = db; mypath = [db];while t ~= sb %从终点db开始回溯p = parent(t);mypath = [p mypath];t = p;endendmydistance = distance(db);例题:运筹学教材P205 第七题D=[0 3 6 1 inf inf inf inf;inf 0 2 inf 4 6 inf inf;inf inf 0 inf inf 5 inf inf;inf inf 4 0 inf 3 6 inf;inf inf inf inf 0 inf inf 7;inf inf inf inf inf 0 7 11;inf inf inf inf inf inf 0 8;inf inf inf inf inf inf inf 0]在command window输入:[mydistance,mypath]=mydijkstra(D,1,8);。

matlab实现dijkstra算法

matlab实现dijkstra算法

matlab实现dijkstra算法Matlab实现Dijkstra算法第一段:什么是Dijkstra算法,为什么它重要?Dijkstra算法是一种用于解决最短路径问题的经典算法。

它由荷兰计算机科学家Edsger Dijkstra在1956年提出,被广泛应用于网络路由、地图导航和图论等领域。

该算法的核心思想是在给定的带权图中找到从起点到终点的最短路径,通过迭代的方式逐步推进,直到找到最短路径或处理完所有节点。

Dijkstra算法被广泛认为是一种高效、可靠的解决方案,具有良好的理论基础和实际应用性。

第二段:如何在Matlab中实现Dijkstra算法?在Matlab中实现Dijkstra算法,可以分为以下几个步骤:1. 创建带权图:我们需要将问题转化为带权图的形式。

在Matlab中,可以使用邻接矩阵来表示图的连接关系,其中每个边的权重存储在矩阵中的对应位置。

2. 初始化距离和路径:将起点到每个节点的距离初始化为无穷大,并为每个节点设置一个空路径。

将起点的距离设置为0,表示起点到自身的距离为0。

3. 遍历节点:循环遍历所有节点,找到距离起点最近的节点,并标记为已访问。

更新与该节点相邻节点的距离和路径信息。

如果经过当前节点到达某个相邻节点的距离更短,则更新该节点的距离和路径。

4. 重复步骤3,直到所有节点都被遍历为止。

这样,我们就能得到从起点到其他节点的最短路径信息。

第三段:个人观点和理解Dijkstra算法是解决最短路径问题的经典算法之一,它具有广泛的应用价值。

在日常生活中,我们经常需要找到最佳的路径规划,例如快递员送货时选择最短路径、地铁或公交车乘客选择最快到达目的地的路线等。

对于这些问题,Dijkstra算法可以提供一个可靠、高效的解决方案。

在使用Matlab实现Dijkstra算法时,我们可以利用Matlab强大的矩阵运算能力和易用的函数库来简化算法的实现过程。

Matlab还提供了丰富的可视化工具,可以帮助我们直观地展示算法执行过程和结果。

暴强Dijkstra算法求任意两点间最短路径(matlab程序)

暴强Dijkstra算法求任意两点间最短路径(matlab程序)

暴强D i j k s t r a算法求任意两点间最短路径(m a t l a b程序)-CAL-FENGHAI-(2020YEAR-YICAI)_JINGBIAN效果展示:开头输入的是点的序列号(表示第几个点),显示的是最短路径的走法(同样以点的序列号显示,表示途径的第几个点)。

%编写m文件function [distance,path]=dijkstra(A,s,e)% [DISTANCE,PATH]=DIJKSTRA(A,S,E)% returns the distance and path between the start node and the end node.%% A: adjcent matrix% s: start node% e: end node% initializen=size(A,1); % node numberD=A(s,:); % distance vectorpath=[]; % path vectorvisit=ones(1,n); % node visibilityvisit(s)=0; % source node is unvisibleparent=zeros(1,n); % parent node% the shortest distancefor i=1:n-1 % BlueSet has n-1 nodestemp=zeros(1,n);count=0;for j=1:nif visit(j)temp=[temp(1:count) D(j)];elsetemp=[temp(1:count) inf];endcount=count+1;end[value,index]=min(temp);j=index; visit(j)=0;for k=1:nif D(k)>D(j)+A(j,k)D(k)=D(j)+A(j,k);parent(k)=j;endendenddistance=D(e);% the shortest distance pathif parent(e)==0return;endpath=zeros(1,2*n); % path preallocationt=e; path(1)=t; count=1;while t~=s && t>0p=parent(t);path=[p path(1:count)];t=p;count=count+1;endif count>=2*nerror(['The path preallocation length is too short.',... 'Please redefine path preallocation parameter.']);endpath(1)=s;path=path(1:count);%算法实现clc; clear; close all;%% 载入设置数据lines = load(''); %点与点之间的距离矩阵A=lines;A(find(A>10))=inf; %对步长的限制,根据自己的要求决定!我们在此选择10. % A就是连接矩阵,其中对角线为0,表示本身% 有连接关系的就对应线的长度% 没有连接关系的就对应inf%% 下面的是dijstra算法,有两种方式可以调用s =input('输入起点'); % 起点(点的序号)e =input('输入终点'); % 终点(点的序号)[distance,path0] = dijkstra(A,s,e);fprintf('\n Use Dijkstra the Min Distance is: %.5f \n', distance);fprintf('\n Use Dijkstra the Min Distance path is: \n');disp(path0);A1 = A;A1(isinf(A1)) = 0;[d, p, pred] = graphshortestpath(sparse(A1), s, e);fprintf('\n Use graphshortestpath the Min Distance is: %.5f \n', d);fprintf('\n Use graphshortestpath the Min Distance path is: \n');disp(p);for i = 1 : length(path0)if i == length(path0)temp = [path0(1) path0(i)];elsetemp = [path0(i) path0(i+1)];endend。

Dijkstra、Floyd算法Matlab_Lingo实现

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计算节点之间最短距离

matlab计算节点之间最短距离

matlab计算节点之间最短距离在计算机科学中,图是一种常用的数据结构,用于表示对象之间的关系。

其中,节点表示对象,边表示两个对象之间的关系。

图包含了许多重要的问题,如最短路径问题,它是一种在有向或无向图中寻找两个节点之间最短路径的算法。

在MATLAB中,有几种方法可以计算图中节点之间的最短距离,包括Dijkstra算法、A*算法和Floyd-Warshall算法。

这些算法是根据不同的原理设计的,各有优缺点。

Dijkstra算法是在有向图中找到从一个寻点到另一个节点的最短路径的常用算法。

算法从起点开始,跟踪到目前为止在最短路径上距离最小的节点,并将其添加到已访问节点的列表中。

然后,它更新与该节点相邻的节点的距离,如果新的距离比之前的距离短,则更新其距离。

最后,它会从未访问过的节点中选出下一个最短路径节点。

该算法需要一个图,一个起点和一个终点。

A*搜索是另一种常用的算法,通常用于在指定的有向图中查找最短路径。

其特点是采用启发式估价函数,以查找节点之间最短路径的代价。

算法将节点按其启发式估价函数的评估值存储,这样可以保证算法总是从最有希望的节点开始移动。

它在一些特定的情况下可以比Dijkstra的算法更快地找到最短路径。

Floyd算法也是一种流行的最短路径算法,可以计算两个节点之间的最短路径,还可以计算任意两个节点之间的最短路径。

该算法由Discrete Mathematics中的Robert W. Floyd提出。

该算法使用动态规划来计算每个节点之间的最短路径。

在对每个节点进行计算后,可以找到任意两个节点之间的最短路径。

总之,计算节点之间最短距离是计算机图形学,图像处理和机器学习等领域中非常重要的问题。

在MATLAB中,可以使用Dijkstra算法、A*算法或Floyd算法来解决它。

这些算法都有自己的优缺点,因此,在选择算法时需要考虑系统需求和计算资源等因素。

Dijkstra算法,最短路径路由算法matlab代码

Dijkstra算法,最短路径路由算法matlab代码

Dijkstra算法,最短路径路由算法matlab代码Dijkstra算法是⼀种最短路径路由算法,⽤于计算⼀个节点到其他所有节点的最短路径。

主要特点是以起始点为中⼼向外层层扩展,直到扩展到终点为⽌。

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

算法详细解释各⽹站都有,不太难。

下边是对下图从D开始到A节点寻找最短路径的matlab代码,个⼈原创。

%% Dijkstra算法%by Jubobolv369 at 2022/1/22clc;clear;close all;%% 初始化带权邻接矩阵,起点、终点等initRoute=[0 12 inf inf inf 16 14;12 0 10 inf inf 7 inf;inf 10 0 3 5 6 inf;inf inf 3 0 4 inf inf;inf inf 5 4 0 2 8;16 7 6 inf 2 0 9;14 inf inf inf 8 9 0;];[row,column]=size(initRoute);start_node=4;end_node=1;close_list=[];open_list=[];%closelist中加⼊初始节点close_list=[start_node,start_node,0];%% 如果closelist中没有终点,则遍历节点,通过⽐较逐渐加⼊节点到closelist。

while isempty(find(close_list(:,1) == end_node))[last1,~]=size(close_list);%获取closelist的最后⼀⾏的索引now_node=close_list(last1,1);%当前节点编号now_length=close_list(last1,3);%当前最优长度[last2,~]=size(open_list); %%获取openlist的最后⼀⾏的索引now_list=initRoute(now_node,:); %从原始矩阵中取初当前节点的边权值i=1;%% 更新openlistfor j=1:column%如果第j个节点可达、不是⾃⾝且不在close_list中,该点可能需要改动或添加到openlist中if now_list(j)~=inf && now_list(j)~=0 && isempty(find(close_list(:,1) == j))if last1==1open_list(i,1)=j;open_list(i,2)=now_node;open_list(i,3)=now_list(j);i=i+1;%如果不在openlist中,就将其添加到其中,否则将通过当前⽗节点到此节点的权值与之前的作⽐较elsek=find(open_list(:,1) == j);if isempty(k)open_list(last2+i,1)=j;open_list(last2+i,2)=now_node;open_list(last2+i,3)=now_list(j)+now_length;i=i+1;elseif open_list(k,3)>(now_list(j)+now_length) %若現在的路徑⾧度⼩,則更新路徑open_list(k,1)=j;open_list(k,1)=j;open_list(k,2)=now_node;open_list(k,3)=now_list(j)+now_length;endendendend%% 更新closelist和openlist。

全局路径规划算法Dijkstra(迪杰斯特拉算法)-matlab

全局路径规划算法Dijkstra(迪杰斯特拉算法)-matlab

全局路径规划算法Dijkstra(迪杰斯特拉算法)-matlab 参考博客链接:https:///kex1n/p/4178782.htmlDijkstra是常⽤的全局路径规划算法,其本质上是⼀个最短路径寻优算法。

算法的详细介绍参考上述链接。

本⽂与参考博⽂相⽐,主要有如下两个不同:1、开发语⾔换成了matlab,代码部分稍作改动就可以实时运⾏在控制器上;2、求取了从起点开始到达每⼀个顶点的最短路径所经历的顶点。

matlab代码:包含测试数据%参考链接https:///kex1n/p/4178782.htmlDefultMaxValue=1e3;NodesMap=[0 1 12 DefultMaxValue DefultMaxValue DefultMaxValue;DefultMaxValue 0 9 3 DefultMaxValue DefultMaxValue;DefultMaxValue DefultMaxValue 0 DefultMaxValue 5 DefultMaxValue;DefultMaxValue DefultMaxValue 4 0 13 15;DefultMaxValue DefultMaxValue DefultMaxValue DefultMaxValue 0 4;DefultMaxValue DefultMaxValue DefultMaxValue DefultMaxValue DefultMaxValue 0];% NodesMap=[0 6 3 DefultMaxValue DefultMaxValue DefultMaxValue;% 6 0 2 5 DefultMaxValue DefultMaxValue;% 3 2 0 3 4 DefultMaxValue;% DefultMaxValue 5 3 0 2 3;% DefultMaxValue DefultMaxValue 4 2 0 5;% DefultMaxValue DefultMaxValue DefultMaxValue 3 5 0];Distance=NodesMap(1,:);%book结果初始化SearchedFlag=zeros(1,length(Distance));SearchedFlag(1)=1;FootsResults=zeros(size(NodesMap));FootsResults(:,1)=1;Preview=zeros(1,length(Distance));Preview(1)=1;for i=2:length(SearchedFlag)iMinID=1;MinValue=DefultMaxValue;DistanceSearchedFlagfor j=1:length(SearchedFlag)if SearchedFlag(j)==0 && Distance(j)<MinValueMinID=j;MinValue=Distance(j);endendMinIDSearchedFlag(MinID)=1;Previewif i>2FootsResults(i,i-1)=Preview(MinID);for j=1:(i-1)Temp=FootsResults(j,:);FindFlag=0;for k=1:length(SearchedFlag)if Temp(k)==0if Temp(k-1)==Preview(MinID)FindFlag=1;break;endendendif FindFlag==1break;endendTempFootsResults(i,:)=Temp;FootsResults(i,k)=MinID;elseFootsResults(i,i)=MinID;endFootsResultsfor j=1:length(SearchedFlag)if NodesMap(MinID,j)<DefultMaxValue && SearchedFlag(j)==0if Distance(j)>(Distance(MinID)+NodesMap(MinID,j))Distance(j)=Distance(MinID)+NodesMap(MinID,j);% FootsResults(i,j)=MinID;Preview(j)=MinID;endendendend% PreviewDistance测试算例1 2所⽤数据都在代码中,⼤家可⾃⾏运⾏程序,查看结果。

matlab中使用dijkstra算法

matlab中使用dijkstra算法

matlab中使⽤dijkstra算法matlab中使⽤dijkstra算法求最短路径最近在搞数学建模,这个dijkstra算法搞r了好⼏天才明⽩,所以⼩菜鸡来记录⼀下。

来讲⼀下⼤概思路:dijkstr算法整体是贪⼼算法思想以这个⽆向图为例,假设从点1开始:第⼀步:创建⼀个邻接矩阵a[nxn],a ij表⽰两个节点的距离,对⾓线以及没有边的都为⽆穷⼤inf第⼆步:初始化⼀些变量n表⽰结点的个数u表⽰已经找到最短距离的结点下标,初始为1p表⽰还未找到最短路径的结点下标数组,初始为[2,3,4,5,6]d表⽰各点的当前最短距离,最终d⾥⾯存的是各点的最短距离,d(1)=0,其他的都为⽆穷⼤infv记录前⼀个到达该点的下标,初始都为0第三步:对p中的结点遍历,对于u(end)结点,(u(end)表⽰刚找到最短距离的那个结点,初始是1),⽐较d(u(end))和u(end)到该点(p中正在进⾏遍历的那点)的距离之和 与 源点到这点的距离(d(该点)),如果前者⼩,则替换d(该点),并且替换v(该点)为u(end)第四步:在p中找到最短的d(p),则该点已找到最短距离,(因为其他的d(p)都⽐它⼤,它不可能再通过其他中转结点到达这点的距离⽐这还⼩),更新u、p,回到第三步,直⾄所有u的长度等于n第五步:打印各个节点的最短距离和路径,路径遍历v即可,距离存在d代码实现:clc,cleara = inf*ones(6);a(1,[2,3])=[1,2];a(2,[3,4,5])=[2,7,5];a(3,5)=1;a(4,[5,6])=[3,2];a(5,6)=6;a=min(a,a');n=length(a);u=1; % 开始出发的结点下标p=1:n; % 还未找到最短路径的结点下标d=inf*ones(1,n); d(1)=0; % 各点的当前最短距离v=zeros(1,n); % 记录前⼀个到达该点的下标while length(u) ~= np=setdiff(p,u(end));for i=pif (d(u(end)) + a(u(end),i) < d(i))d(i) = d(u(end)) + a(u(end),i);v(i) = u(end);endend[tem, i] = min(d(p)); % tem是d(p)中最⼩的,i是取最⼩值时p向量的下标u = [u, p(i(1))];endfor i=setdiff(1:n,u(1))disp("点"+u(1)+"到点"+i+"最短距离为:"+d(i))disp("路径:")j=i;index=j;while v(j) ~= u(1)j=v(j);index=[j,index];endindex=[u(1),index];disp(index)end运⾏结果:头⼤,好像理解还不是很透啊啊啊end~。

4.1 图论中最短路算法与程序实现

4.1 图论中最短路算法与程序实现

图论中最短路算法与程序实现图论中的最短路问题(包括无向图和有向图)是一个基本且常见的问题。

主要的算法有Dijkstra 算法和Floyd 算法。

Dijkstra 算法是求出指定两点之间的最短路,算法复杂度为 Floyd 算法是求出任意两点之间的最短路,算法复杂度为 2()O n 3()O n1.Dijkstra算法2. Floyd算法算法程序(Matlab)为:for k=1:nfor i=1 :nfor j=1:nt=B(i,k)+B(k,j);if t<B(i,j) B(i,j)=t; end endendend起点终点距离起点终点距离起点终点距离12400718160151725013450892001617140243008152851618130221230910180172724024714010111501819204346001015160182518045210111214019201404193101114130192417556230121320020211805720013344002024190673201415190212230068340142619021232707817015161702147350表1 各点距离(m)实例:已知50个点之间相互连接信息见表1及续表。

求最短距离矩阵续表1 各点距离(m)起点终点距离起点终点距离起点终点距离22441602229313640190 22452702230313738135 22481802230423839130 23242402330433941310 23292102331324041140 23302902331364050190 23441502331504250200 24251702432334344260 24281302432354345210 26271402632364546240 26343202633344648280 27281902735374849200 2829260283639n=50; %Matlab实现的Floyd算法A=zeros(n,n);for i=1:nfor j=1:nif(i==j) A(i,j)=0;else A(i,j)=100000;endendend %赋直接距离信息A(1,2)=400;A(1,3)=450; A(2,4)=300;A(2,21)=230; A(2,47)=140;A(3,4)=600;A(4,5)=210;A(4,19)=310;A(5,6)=230;A(5,7)=200; A(6,7)=320; A(6,8)=340;A(7,8)=170;A(7,18)=160;A(8,9)=200;A(8,15)=285; A(9,10)=180; A(10,11)=150; A(10,15)=160; A(11,12)=140; A(11,14)=130; A(12,13)=200; A(13,34)=400;A(14,15)=190;A(14,26)=190; A(15,16)=170; A(15,17)=250; A(16,17)=140;A(16,18)=130; A(17,27)=240; A(18,19)=204; A(18,25)=180; A(19,20)=140; A(19,24)=175; A(20,21)=180; A(20,24)=190; A(21,22)=300; A(21,23)=270; A(21,47)=350;A(22,44)=160;A(22,45)=270;A(22,48)=180;A(23,24)=240; A(23,29)=210;A(23,30)=290;A(23,44)=150;A(24,25)=170;A(24,28)=130; A(26,27)=140;A(26,34)=320;A(27,28)=190;A(28,29)=260;A(29,31)=190; A(30,31)=240;A(30,42)=130;A(30,43)=210;A(31,32)=230;A(31,36)=260; A(31,50)=210;A(32,33)=190;A(32,35)=140;A(32,36)=240;A(33,34)=210; A(35,37)=160;A(36,39)=180;A(36,40)=190;A(37,38)=135;A(38,39)=130; A(39,41)=310;A(40,41)=140;A(40,50)=190;A(42,50)=200;A(43,44)=260; A(43,45)=210;A(45,46)=240;A(46,48)=280;A(48,49)=200;for j=1:nfor i=1:j-1A(j,i)=A(i,j); %使矩阵对称endendB=A;%利用Floyd算法计算最短距离矩阵for k=1:nfor i=1 :nfor j=1:nt=B(i,k)+B(k,j);if t<B(i,j) B(i,j)=t; endendendend %输出距离矩阵到文件fid=fopen('distance.txt','w'); for i=1:nfor j=1:nfprintf(fid,'%4d ',B(i,j)); endfprintf(fid,'\n');endfclose(fid);谢谢!。

0001Dijkstra算法找最短路径代码

0001Dijkstra算法找最短路径代码

克拉算法的核心就是从原点出发(原点可以是自己定义的任意一个点),以原点为圆心,半径从小到大,判断原点到半径上面的点的最短距离,这个距离可能是圆心r0->r1(半径较小)->r2(半径较大)或者是r0->r2(如果存在r0到r2这条路径的话)例某公司在六个城市c1, c2,,,, c6 中有分公司,从ci到cj 的直接航程票价记在下述矩阵的(i, j) 位置上。

(∞表示无直接航路),请帮助该公司设计一张城市c1 到其它城市间的票价最便宜的路线图。

符号含义:用矩阵a[n,n](n 为顶点个数)存放各边权的邻接矩阵,行向量pb 、index1、index2 、d 分别用来存放P 标号信息、标号顶点顺序、标号顶点索引、最短通路的值。

其中分量index2(i) 存放始点到第i 点最短通路中第i 顶点前一顶点的序号;d(i) 存放由始点到第i 点最短通路的值。

求第一个城市到其它城市的最短路径的Matlab 程序如下:(可以直接复制下方代码运行)其中a(1,2)表示第一个点到第二个点的距离,以此类推,在实际应用中先把所有点直接的距离矩阵写出来,不连通的点用无穷大表示clc,clear alla=zeros(6);a(1,2)=50;a(1,4)=40;a(1,5)=25;a(1,6)=10;a(2,3)=15;a(2,4)=20;a(2,6)=25;a(3,4)=10;a(3,5)=20;a(4,5)=10;a(4,6)=25;a(5,6)=55;a=a+a'a(find(a==0))=inf %将a=0的数全部替换为无强大pb(1:length(a))=0;pb(1)=1; %当一个点已经求出到原点的最短距离时,其下标i对应的pb(i)赋1index1=1; %存放存入S集合的顺序index2=ones(1,length(a)); %存放始点到第i点最短通路中第i顶点前一顶点的序号d(1:length(a))=inf;d(1)=0; %存放由始点到第i点最短通路的值temp=1; %temp表示c1,算c1到其它点的最短路。

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

function [c0,c,path0,path]=dijkstra(s,t,C,flag)
% Use the Dijkstra's algorithm to find the shortest path from
% s to t and can also find the shortest path between s and all
% the other points.
% Reference: Graph Theory with Applications by J. A. Bondy and
% U. S. R. Murty.
% Input -- s is the starting point and also is the point s.
% -- t is the given terminal point and is the point t.
% -- C \in R^{n \times n}is the cost matrix, where
% C(i,j)>=0 is the cost from point i to point j.
% If there is no direct connection between point i and
% j, C(i,j)=inf.
% -- flag: if flag=1, the function just reports the
% shortest path between s and t; if flag~=1, the
% function reports the shortest path between s and t,
% and the shortest paths between s and other points.
% Output -- c0 is the minimal cost from s to t.
% -- path0 denotes the shortest path form s to t.
% -- c \in R{1\times n} in which the element i is the
% minimal cost from s to point i.
% -- path \in R^{n \times n} in which the row i denotes
% the shortest path from s to point i.
% Copyright by MingHua Xu(徐明华), Changhzou University, 27 Jan. 2014. s=floor(s);
t=floor(t);
n=size(C,1);
if s<1 || t < 1 || s > n || t > n
error(' The starting point and the terminal point exceeds the valid range');
end
if t==s
disp('The starting point and the terminal point are the same points');
end
label=ones(1,n)*inf;
label(s)=0;
S=[s];
Sbar=[1:s-1,s+1:n];
c0=0;
path=zeros(n,n);
path(:,1)=s;
c=ones(1,n)*inf;
parent=zeros(1,n);
i=1; % number of points in point set S.
while i<n
% for each point in Sbar, replace label(Sbar(j)) by
% min(label(Sbar(j)),label(S(k))+C(S(k),Sbar(j)))
for j=1:n-i
for k=1:i
if label(Sbar(j)) > label(S(k))+C(S(k),Sbar(j))
label(Sbar(j))=label(S(k))+C(S(k),Sbar(j));
parent(Sbar(j))=S(k);
end
end
end
% Find the minmal label(j), j \in Sbar.
temp=label(Sbar(1));
son=1;
for j=2:n-i
if label(Sbar(j))< temp
temp=label(Sbar(j));
son=j;
end
end
% update the point set S and Sbar
S=[S,Sbar(son)];
Sbar=[Sbar(1:son-1),Sbar(son+1:n-i)];
i=i+1;
% if flag==1, just output the shortest path between s and t.
if flag==1 && S(i)==t
son=t;
temp_path=[son];
if son~=s
while parent(son)~=s
son=parent(son);
temp_path=[temp_path,son];
end
temp_path=[temp_path,s];
end
temp_path=fliplr(temp_path);
m=size(temp_path,2);
path0(1:m)=temp_path;
c_temp=0;
for j=1:m-1
c_temp=c_temp+C(temp_path(j),temp_path(j+1));
end
c0=c_temp;
path(t,1:m)=path0;
c(t)=c0;
return
end
end
% Form the output results
for i=1:n
son=i;
temp_path=[son];
if son~=s
while parent(son)~=s
son=parent(son);
temp_path=[temp_path,son];
end
temp_path=[temp_path,s];
end
temp_path=fliplr(temp_path);
m=size(temp_path,2);
path(i,1:m)=temp_path;
c_temp=0;
for j=1:m-1
c_temp=c_temp+C(temp_path(j),temp_path(j+1));
end
c(i)=c_temp;
c0=c(t);
path0=path(t,:);
end
return。

相关文档
最新文档