最短路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。

  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。

相关文档
最新文档