最短路dijkstra算法Matlab程序调用举例
Dijkstra求最短路的MATLAB程序(含注释)
![Dijkstra求最短路的MATLAB程序(含注释)](https://img.taocdn.com/s3/m/0ef16cd8ce2f0066f53322f6.png)
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程序](https://img.taocdn.com/s3/m/d1d303647e21af45b307a8a5.png)
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 > nerror(' The starting point and the terminal point exceeds the valid range');endif t==sdisp('The starting point and the terminal point are the same points');endlabel=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-ifor k=1:iif 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);endendend% Find the minmal label(j), j \in Sbar.temp=label(Sbar(1));son=1;for j=2:n-iif label(Sbar(j))< temptemp=label(Sbar(j));son=j;endend% update the point set S and SbarS=[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)==tson=t;temp_path=[son];if son~=swhile parent(son)~=sson=parent(son);temp_path=[temp_path,son];endtemp_path=[temp_path,s];endtemp_path=fliplr(temp_path);m=size(temp_path,2);path0(1:m)=temp_path;c_temp=0;for j=1:m-1c_temp=c_temp+C(temp_path(j),temp_path(j+1));endc0=c_temp;path(t,1:m)=path0;c(t)=c0;returnendend% Form the output resultsfor i=1:nson=i;temp_path=[son];if son~=swhile parent(son)~=sson=parent(son);temp_path=[temp_path,son];endtemp_path=[temp_path,s];endtemp_path=fliplr(temp_path);m=size(temp_path,2);path(i,1:m)=temp_path;c_temp=0;for j=1:m-1c_temp=c_temp+C(temp_path(j),temp_path(j+1));endc(i)=c_temp;c0=c(t);path0=path(t,:);endreturn。
matlab路径算法
![matlab路径算法](https://img.taocdn.com/s3/m/cc86767d66ec102de2bd960590c69ec3d4bbdb73.png)
matlab路径算法MATLAB(Matrix Laboratory)是一种用于算法开发、数据可视化、数据分析以及数值计算的编程语言和环境。
在MATLAB中,路径算法通常用于解决诸如最短路径、最小生成树等优化问题。
以下是一个简单的Dijkstra算法的实现,该算法用于找到图中两点间的最短路径。
matlab复制代码:function [path, distance] = dijkstra(adjMatrix, sourceNode)nNodes = size(adjMatrix, 1); % 获取节点数visited = false(1, nNodes); % 初始化访问状态distance = inf(1, nNodes); % 初始化距离distance(sourceNode) = 0; % 源节点到自己的距离为0path = cell(1, nNodes); % 初始化路径for i = 1:nNodes[~, minIndex] = min(distance); % 找到当前最小距离的节点node = minIndex + 1; % MATLAB的索引从1开始,所以需要+1if ~visited(node)visited(node) = true; % 标记为已访问for j = 1:nNodesif adjMatrix(node, j) && ~visited(j) && distance(j) > distance(node) + adjMatrix(node, j)distance(j) = distance(node) + adjMatrix(node, j); % 更新距离path{j} = [path{j}; node]; % 更新路径endendendendend在这个函数中,adjMatrix是一个邻接矩阵,表示图中各节点之间的连接关系和权重。
最短路径算法matlab代码
![最短路径算法matlab代码](https://img.taocdn.com/s3/m/167dc297b1717fd5360cba1aa8114431b90d8eeb.png)
最短路径算法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代码实现。
利用MATLAB实现Dijkstra算法
![利用MATLAB实现Dijkstra算法](https://img.taocdn.com/s3/m/98af4667a26925c52cc5bf2e.png)
利用计算机语言编程实现D算法一:实验目的本实验课程主要目的是让学生够熟练掌握图论中的D算法。
二:实验方法选择MATLAB语言编程实现D算法。
三:实验要求1.输入必要参数,包括:节点个数、节点间路径长度、给定节点;2.输出给定节点到其它各节点的最短路径、径长;3.节点间路径长度用矩阵形式表示。
四:实验内容无向图共有7个节点,如下图所示。
v1457计算机输入的节点间路径长度为7×7矩阵:12345671 2 3 4 5 6 7012310620543045407 6408780⎡⎤∞∞∞⎢⎥∞∞∞∞⎢⎥⎢⎥∞∞∞⎢⎥∞∞∞∞⎢⎥⎢⎥∞∞∞⎢⎥∞∞∞⎢⎥⎢⎥∞∞∞∞⎣⎦v v v v v v vvvvvvvv若1v为指定节点,则1v到其它各节点的最短路径及径长的计算机计算结果为:提示:不相邻的两个节点间∞可以用相对较大的数代替(如输入100表示∞)五:实验原理1. D 算法原理已知图G=(V,E),将其节点集分为两组:置定节点集p G 和未置定节点集p G G -。
其中p G 内的所有置定节点,是指定点s v 到这些节点的路径为最短(即已完成最短路径的计算)的节点。
而p G G -内的节点是未置定节点,即s v 到未置定节点距离是暂时的,随着算法的下一步将进行不断调整,使其成为最短径。
在调整各未置定节点的最短径时,是将p G 中的节点作为转接点。
具体地说,就是将p G 中的节点作为转接点,计算(s v ,j v )的径长(j p v G G ∈-),若该次计算的径长小于上次的值,则更新径长,否则,径长不变。
计算后取其中径长最短者,之后将j v 划归到p G 中。
当(p G G -)最终成为空集,同时p G G =,即求得s v 到所有其他节点的最短路径。
j w 表示s v 与其他节点的距离。
在p G 中,i w 表示上一次划分到p G 中的节点iv 到s v 得最短路径。
在 p G G -中,表示s v 到j v (j p v G G ∈-)仅经过p G 中的节点作为转接点所求得的该次的最短路径的长度。
MATLAB解决最短路径问题代码
![MATLAB解决最短路径问题代码](https://img.taocdn.com/s3/m/708bcf99dd88d0d233d46a6b.png)
默认是Dijkstra 算法是有权的, 我想如果把权都赋1的话, 就相当于没权的了参数是带权的稀疏矩阵及结点看看这两个例子(一个有向一个无向), 或许你能找到你想知道的% Create a directed graph with 6 nodes and 11 edgesW = [.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 pathset(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的图像[qypt, nqypt] = ptxzm(xjpt,quyu);changdu = length(bhxz(jdxx,1:6));%选出x中y区的标号,只是分区域,求长度并绘制它tt = z(:,[1,2,end])';k = min(min(tt(1:2,:)));%求两次最小值t = tt(1:2,:) ;xsjz = sparse(t(2,:),t(1,:),tt(3,:),changdu,changdu);%产生稀疏矩阵[dist, path, pred] = zdljxz(xsjz, qypt, k );%三个原包矩阵通过zdljxz计算得到最短路径hold onfor j = 1:nqyptcolors = rand(1,3);%产生随机数并用颜色标记hzptxc(path{j},jdxx,colors)endhold offaxis equal%把坐标轴单位设为相等zjd = jdfgd( path, quyu);function z = lxjl(x, y)%计算路线的距离[m n] = size(y);for i = 1:myy(i,1:2) = x(y(i,1),2:3);yy(i,3:4) = x(y(i,2),2:3);endz = sqrt((yy(:,3) - yy(:,1)).^2 + (yy(:,2) - yy(:,4)).^2);y = sort(y');y = y';z = [y yy z];z = sortrows(z);function [z lz] = ptxz(xjpt,y)pt = xjpt(:,2);wei = ismember(xjpt(:,1),y);z = pt(wei);lz = length(z);unction hzptxc(path,jdxx,colors)n = length(path);% hold onfor i = 1:nhzptjd(jdxx, path{i},colors)end% hold offunction hzptjd(jdxx,x,colors)% m = length(x);% x = x';hold onplot(jdxx(x,2),jdxx(x,3),'o','LineStyle' ,'-' ,...'Color',colors,'MarkerEdgeColor',colors)plot(jdxx(x(1),2),jdxx(x(1),3),'*','MarkerFaceColor',colors)hold offfunction hzlx(x)%绘制x的图像[m n] = size(x);hold onfor i = 1:mplot([x(i,3) x(i,5)],[x(i,4) x(i,6)],'k:')endhold offfunction z = bhxz(x,y)%选出x中y区的标号,只是分区域xzq = x(:,4);xzr = ismember(xzq,y);z = x(xzr,:);z = z(:,1);。
最短路dijkstra算法Matlab程序
![最短路dijkstra算法Matlab程序](https://img.taocdn.com/s3/m/e7c3521ab52acfc789ebc91a.png)
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 > nerror(' The starting point and the terminal point exceeds the valid range');endif t==sdisp('The starting point and the terminal point are the same points');endlabel=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-ifor k=1:iif 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);endendend% Find the minmal label(j), j \in Sbar.temp=label(Sbar(1));son=1;for j=2:n-iif label(Sbar(j))< temptemp=label(Sbar(j));son=j;endend% update the point set S and SbarS=[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)==tson=t;temp_path=[son];if son~=swhile parent(son)~=sson=parent(son);temp_path=[temp_path,son];endtemp_path=[temp_path,s];endtemp_path=fliplr(temp_path);m=size(temp_path,2);path0(1:m)=temp_path;c_temp=0;for j=1:m-1c_temp=c_temp+C(temp_path(j),temp_path(j+1));endc0=c_temp;path(t,1:m)=path0;c(t)=c0;returnendend% Form the output resultsfor i=1:nson=i;temp_path=[son];if son~=swhile parent(son)~=sson=parent(son);temp_path=[temp_path,son];endtemp_path=[temp_path,s];endtemp_path=fliplr(temp_path);m=size(temp_path,2);path(i,1:m)=temp_path;c_temp=0;for j=1:m-1c_temp=c_temp+C(temp_path(j),temp_path(j+1));endc(i)=c_temp;c0=c(t);path0=path(t,:);endreturn。
D_i_j_k_s_t_r_a最短路算法MATLAB程序_
![D_i_j_k_s_t_r_a最短路算法MATLAB程序_](https://img.taocdn.com/s3/m/004015cb5fbfc77da269b1be.png)
从起点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最短路
![matlab最短路](https://img.taocdn.com/s3/m/d69bb83e360cba1aa911dad3.png)
matlab最短路算法描述:输入图G,源点v0,输出源点到各点的最短距离D 中间变量v0保存当前已经处理到的顶点集合,v1保存剩余的集合 1.初始化v1,D2.计算v0到v1各点的最短距离,保存到Dfor each i in v0;D(j)=min[D(j),G(v0(1),i)+G(i,j)] ,where j in v13.将D中最小的那一项加入到v0,并且从v1删除这一项。
4.转到2,直到v0包含所有顶点。
%dijsk最短路径算法clear,clcG=[inf inf 10 inf 30 100;inf inf 5 inf inf inf;inf 5 inf 50 inf inf;inf inf inf inf inf 10;inf inf inf 20 inf 60;inf inf inf inf inf inf; ]; %邻接矩阵N=size(G,1); %顶点数v0=1; %源点v1=ones(1,N); %除去原点后的集合v1(v0)=0;%计算和源点最近的点D=G(v0,:);while 1D2=D;for i=1:Nif v1(i)==0D2(i)=inf;endendD2[Dmin id]=min(D2);if isinf(Dmin),error,endv0=[v0 id] %将最近的点加入v0集合,并从v1集合中删除v1(id)=0;if size(v0,2)==N,break;end%计算v0(1)到v1各点的最近距离fprintf('计算v0(1)到v1各点的最近距离\n');v0,v1id=0;for j=1:N %计算到j的最近距离if v1(j)for i=1:Nif ~v1(i) %i在vo中D(j)=min(D(j),D(i)+G(i,j));endD(j)=min(D(j),G(v0(1),i)+G(i,j));endendendfprintf('最近距离\n');Dif isinf(Dmin),error,endendv0%>> v0%v0 =% 1 3 5 4 6******************************************************% Dijkstra's Shortest Path%% final = dijkstra( A, x, y )%% Description: returns the shortest path from x to y given adjacency % matrix A. Utilizes Dijkstra's shortest path algorithm. %% A = adjacency matrix of the graph (includes point x and y)% x = intial node% y = terminal node% IN = set of nodes whose shortest path from x is known % z,p = temporary nodes% d = vector of lengths from initial point. i.e. d(p) = x to p% s = vector of the previous node on a shortest path for any node %% Author: Josh Eads% Date: 1/23/2006function final = dijkstra( A, x, y )%modify A so that lengths of 0 are invalid (-1) A(find(A == 0)) = NaN;%initialize IN to include only xIN = x;%initialize ss = zeros(1,length(A));%initialize d & d(x) (distance to self) d = zeros(1,length(A));d(x) = 0;%loop through all the nodes in A for z = 1:length(A)%don't calculate values already in IN%if ~(find(IN == z))if ~isWithin(IN, z)%grab the distance from x to z from A (-1 denotes unreachable) d(z) = A(x,z);%set the previous node to xs(z) = x;endend%process nodes into IN%while y isn't in set IN%while ~(find(IN == y))while ~isWithin(IN, y)tempMin = [];%add the node not in IN with the minimum distance into INfor z = 1:length(A)%if z isn't in IN%if ~(find(IN == z))if ~isWithin(IN, z)tempMin = [tempMin, d(z)];endend%find the minimum value from tempMinp = min(tempMin);%find the minimum distance nodessearch = find(d == p);%cycle through all the minimum distance nodes until one not in IN is %foundfor i = 1:length(search)search = find(d == p);%store in p if the node isn't in INif( ~isWithin(IN, search(i)) )p = search(i);break;endend%add node p into ININ = [IN, p];%recompute d for all non-IN nodes, and adjust sfor z = 1:length(A)%if z isn't in IN%if ~(find(IN == z))if ~isWithin(IN, z)oldDistance = d(z);%if the new path is shorter for z, update d(z)d(z) = min(d(z), d(p) + A(p,z));%if the new and old distances don't match, update s(z) if ~(d(z) == oldDistance)s(z) = p;endendendend%write the shortest path to final final = y;z = y;while (z == x) == 0final = [final, s(z)];z = s(z);endfinal=fliplr(final);% isWithin Function% source = matrix to search through % search = item to search for % % returns - true if search is within source function truth =isWithin(source, search)truth = 0;for i = 1:length(source)if(source(i) == search)truth = 1;endend。
暴强Dijkstra算法求任意两点间最短路径(matlab程序)
![暴强Dijkstra算法求任意两点间最短路径(matlab程序)](https://img.taocdn.com/s3/m/21975f2ecf84b9d528ea7af0.png)
暴强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。
matlab计算最短路径讲述
![matlab计算最短路径讲述](https://img.taocdn.com/s3/m/ca5c74e110661ed9ac51f34f.png)
湖南大学MATLAB实训报告题目:matlab计算最短路径问题学院名称:信息科学与工程学院专业班级:软件工程四班学生姓名:彭天越学号: 20112601416 日期: 2013年7月3号目录题目 (2)问题描述 (3)(1)根据无向图A,使用Di.jistra算法 (3)(2)根据有向图B,使用Warshall-Floyd算法 (4)思路及代码 (4)(1)思路 (4)(2)源代码 (5)测试结果说明 (10)(1)Di.jistra算法 (10)(2)Floyd算法 (11)小结 (11)题目求下图中顶点ν1到顶点ν11的最短距离和最短路(2学分)B.有向图问题描述(1)根据无向图A,使用Di.jistra算法(2)根据有向图B,使用Warshall-Floyd算法思路及代码(1)思路(1)Dijkstra算法使用范围:1)寻求从一固定顶点到其余各点的最短路径;2)有向图、无向图和混合图;3)权非负.算法思路:采用标号作业法,每次迭代产生一个永久标号, 从而生长一颗以v为根的最短路树,在这颗树上每个顶点与根节点之间的路径皆为最短路径. 诉法步骤:S: 具有永久标号的顶点集;l(v): v的标记; f(v):v的父顶点,用以确定最短路径;输入加权图的带权邻接矩阵w=[w(vi ,vj)]nxm.1)初始化令l(v0)=0,S=Φ;∀ v≠v,l(v)=∞;2)更新l(v), f(v)寻找不在S中的顶点u,使l(u)为最小.把u加入到S中,然后对所有不在S中的顶点v,如l(v)>l(u)+w(u,v),则更新l(v),f(v), 即l(v)←l(u)+w(u,v),f(v)←u;3)重复步骤2), 直到所有顶点都在S中为止.(2)Floyd算法使用范围:1)求每对顶点的最短路径;2)有向图、无向图和混合图;算法思想:直接在图的带权邻接矩阵中用插入顶点的方法依次递推地构造出n个矩阵D(1), D(2), …, D(n), D(n)是图的距离矩阵, 同时引入一个后继点矩阵记录两点间的最短路径.算法步骤:d(i,j) : i到j的距离;path(i,j): i到j的路径上i的后继点;输入带权邻接矩阵a(i,j).1)赋初值对所有i,j, d(i,j)←a(i,j) , path(i,j)←j,k=l.2)更新d(i,j) , path(i,j)对所有i,j, 若d(i,k)+d(k,j)<d(i,j),则d(i,j)←d(i,k)+d(k,j) , path(i,j)←path(i,k) , k ←k+1 3)重复2)直到k=n+1(2)源代码(1)Dijkstra.m文件%计算最短路径(Dijkstra算法)%min表示最短的距离%path表示最短路径%w表示邻接矩阵%start表示开始点%terminal表示终止点function [min,path]=dijkstra(w,start,terminal)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;for j=1:length(s)if 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;endendend%v1=0;k=inf;for i=1:nins=0;for j=1:length(s)if i==s(j)ins=1;endendif ins==0v=i;if k>label(v)k=label(v);v1=v;endendends(length(s)+1)=v1;u=v1;end%求出最短距离与最短路径min=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);%循环输出路径text01.m脚本文件进行测试clear;clc;fprintf('计算最短路径(Dijkstra算法)\n');x=[0,2,1,8,inf,inf,inf,inf,inf,inf,inf;2,0,inf,6,1,inf,inf,inf,inf,inf,inf;1,inf,0,7,inf,inf,9,inf,inf,inf,inf;8,6,7,0,5,1,2,inf,inf,inf,inf;inf,1,inf,5,0,3,inf,2,1,inf,inf;inf,inf,inf,1,3,0,4,inf,6,inf,inf;inf,inf,9,2,inf,4,0,inf,3,1,inf;inf,inf,inf,inf,2,inf,inf,0,7,inf,inf;inf,inf,inf,inf,inf,6,3,7,0,1,2;inf,inf,inf,inf,inf,inf,1,inf,1,0,1;inf,inf,inf,inf,inf,inf,inf,inf,2,1,0]%x=input('输入邻接矩阵:');start=input('输入起点:');terminal=input('输入终点:');fprintf('计算结果如下:');[min,path_way]=dijkstra(x,start,terminal)Floyd.m函数%计算最短路径(Floyd算法)%[D,path,min1,path1]=floyd(a,start,terminal)返回矩阵D, path; 并返回start与terminal之间的最短距离min1和最短路径path1.%path(i,j): 表示i到j的路径上i的后继点;%D(i,j) : 表示i到j的距离;%输入带权邻接矩阵a(i,j).%1)赋初值% 对所有i,j, D(i,j)<-a(i,j) , path(i,j)<-j%2)更新D(i,j) , path(i,j)% 对所有i,j, 若D(i,k)+D(k,j)<d(i,j),则% D(i,j)<-D(i,k)+D(k,j) , path(i,j)<-path(i,k) , k<-k+1 %3)重复2)直到k=n+1function [D,path,min1,path1]=floyd(a,start,terminal)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==3%参数个数为3的时候执行min1=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;endtext02.m脚本文件,进行测试clear;clc;fprintf('计算最短路径(Floyd算法)\n');x=[0,2,inf,8,inf,inf,inf,inf,inf,inf,inf; inf,0,inf,6,1,inf,inf,inf,inf,inf,inf;1,inf,0,inf,inf,inf,9,inf,inf,inf,inf;inf,inf,7,0,inf,inf,inf,inf,inf,inf,inf;inf,inf,inf,5,0,inf,inf,inf,1,inf,inf;inf,inf,inf,1,3,0,4,inf,inf,inf,inf;inf,inf,inf,2,inf,inf,0,inf,3,1,inf;inf,inf,inf,inf,2,inf,inf,0,inf,inf,inf;inf,inf,inf,inf,inf,6,inf,7,0,inf,inf;inf,inf,inf,inf,inf,inf,inf,inf,1,0,1;inf,inf,inf,inf,inf,inf,inf,inf,2,inf,0]%x=input('输入邻接矩阵:');start=input('输入起点:');terminal=input('输入终点:');fprintf('计算结果如下:');[D,path,min,path_way]=floyd(x,start,terminal)测试结果说明(1)Di.jistra算法根据无向图A,可以知道matlab计算出来的结果是正确的湖南大学(2)Floyd算法根据有向图B,可以知道matlab计算出来的结果是正确的小结Matlab 现在的发展已经使其成为一种集数值运算、符号运算、数据可视化、图形界面设计、程序设计、仿真、图像处理、电路设计等多种功能于一体的集成化软件,在矩阵方面等处理占据很大的优势,图论中的很多问题均能通过matlab 来解决,方便而高效,比如哥尼斯堡七桥问题,连通性邻接矩阵等概念的提出,更便于解决图论中的计算最短路径的问题,要熟练掌握一门语言,乃至精通就必须要多练多动手自己多思考,然后要懂得充分的利用可靠资源!11。
matlab最短路dijkstra算法
![matlab最短路dijkstra算法](https://img.taocdn.com/s3/m/4fca201e0622192e453610661ed9ad51f11d5447.png)
matlab最短路dijkstra算法Matlab最短路Dijkstra算法Dijkstra算法是一种用于寻找图中最短路径的常用算法,可以解决许多实际问题,例如路网规划、通信网络优化等。
在Matlab中,我们可以利用其强大的矩阵运算和图论工具箱来实现Dijkstra算法,快速地找到两个节点之间的最短路径。
在开始之前,我们需要了解一些基本概念。
首先,图是由节点和边组成的数据结构,节点表示图中的位置或对象,边表示节点之间的连接关系。
每个边都有一个权重,用于表示节点之间的距离或代价。
最短路径问题的目标是找到两个节点之间的路径,使得路径上所有边的权重之和最小。
在Matlab中,我们可以使用图对象来表示图,并使用addnode和addedge函数来添加节点和边。
接下来,我们将使用Dijkstra算法来计算最短路径。
该算法的基本思想是从起始节点开始,逐步扩展到其他节点,每次选择当前距离起始节点最近的未访问节点,并更新其距离。
当所有节点都被访问过后,即可得到最短路径。
我们需要创建一个图对象,并添加节点和边。
假设我们有一个包含6个节点的图,节点之间的连接关系如下:节点1与节点2之间的距离为7节点1与节点3之间的距离为9节点1与节点6之间的距离为14节点2与节点3之间的距离为10节点2与节点4之间的距离为15节点3与节点4之间的距离为11节点3与节点6之间的距离为2节点4与节点5之间的距离为6节点5与节点6之间的距离为9我们可以使用addnode和addedge函数来添加节点和边,代码如下:g = graph();g = addnode(g, 6);g = addedge(g, [1 1 1 2 3 3 4 5], [2 3 6 3 4 6 5 6], [7 9 14 1015 11 6 9]);接下来,我们将使用Dijkstra算法来计算节点1到其他节点的最短路径。
Matlab提供了shortestpath函数来进行计算,代码如下:[dist, path, pred] = shortestpath(g, 1, 'Method', 'Dijkstra');其中,dist是一个数组,表示节点1到其他节点的最短距离;path 是一个cell数组,表示节点1到其他节点的最短路径;pred是一个数组,表示在最短路径中每个节点的前驱节点。
matlab网络最短路径问题及多种算法程序
![matlab网络最短路径问题及多种算法程序](https://img.taocdn.com/s3/m/49128f6c770bf78a652954cb.png)
主要内容
引例1:最短运输路线问题 引例2:最廉价航费表的制定 Dijkstra算法 Floyd算法 两个例子的求解
引例1:最短运输路线问题
如图的交通网络,每条弧上的数字代表车辆在该路段行 驶所需的时间,有向边表示单行道,无向边表示可双向 行驶。若有一批货物要从1号顶点运往11号顶点,问运 货车应沿哪条线路行驶,才能最快地到达目的地?
min=label(terminal);
path(1)=terminal;
i=1;
while path(i)~=start
path(i+1)=f(path(i));
i=i+1 ;
③
end
path(i)=start;
L=length(path);
path=path(L:-1:1);
end, end
if ins==0
寻找不在S中的顶点u,使l(u)为最小.把u加入到S中,然 后对所有不在S中的顶点v,如l(v)>l(u)+w(u,v),则更新 l(v),f(v), 即 l(v)l(u)+w(u,v),f(v)u; 3) 重复步骤2), 直到所有顶点都在S中为止.
MATLAB程序(Dijkstra算法)
function [min,path]=dijkstra(w,start,terminal)
2
8
177
8
8
3
5
3
4
5
61
12
9 62
10
5
11
37
2
99
2 10
a
3
引例2:最廉价航费表的制定
某公司在六个城市C1,C2,C3,C4,C5,C6都有分公司, 公司成员经常往来于它们之间,已知从Ci到Cj的直达航 班票价由下述矩阵的第i行,第j列元素给出(表示无
Dijkstra算法,最短路径路由算法matlab代码
![Dijkstra算法,最短路径路由算法matlab代码](https://img.taocdn.com/s3/m/9bf86b5d2f3f5727a5e9856a561252d380eb208e.png)
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算法
![dijkstra算法](https://img.taocdn.com/s3/m/a1aaedf9e45c3b3566ec8b7d.png)
1、(求两点之间的最短路程)Dijkstra算法的MATLAB程序dijkstra.m如下:% Dijkstra’s Algorithmfunction [S, D]= dijkstra (i,m,W)% i为最短路径的起始点,m为图顶点数,W为图的带权邻接矩阵% 不构成边的两顶点之间用inf 表示% S的每一列从上到下记录了从始点到终点的最短路径所经顶点的序号% D是一个行向量,记录了S中所示路径的大小dd=[ ];tt=[ ];ss=[ ];ss(1,1)=i; v=1:m; v(i)=[ ];dd=[0;i];% dd的第二行是每次求出的最短路径的终点,第一行是最短路径的值kk=2; [mdd,ndd]=size(dd);while ~isempty(v)[tmpd,j]=min(W(i,v));tmpj=v(j);for k=2:ndd[tmp1,jj]=min(dd(1,k)+W(dd(2,k),v));tmp2=v(jj);tt(k-1,:)=[tmp1,tmp2,jj];endtmp=[tmpd,tmpj,j;tt]; [tmp3,tmp4]=min(tmp(:,1));if tmp3==tmpd,ss(1:2,kk)=[i;tmp(tmp4,2)];else, tmp5=find(ss(:,tmp4)~=0); tmp6=length(tmp5);if dd(2,tmp4)==ss(tmp6,tmp4)ss(1:tmp6+1,kk)=[ss(tmp5,tmp4); tmp(tmp4,2)];else, ss(1:3,kk)=[i; dd(2,tmp4); tmp(tmp4,2)];endenddd=[dd,[tmp3;tmp(tmp4,2)]];v(tmp(tmp4,3))=[ ];[mdd,ndd]=size(dd);kk=kk+1;endS=ss;D=dd(1,: );。
图论算法及matlab程序的三个案例
![图论算法及matlab程序的三个案例](https://img.taocdn.com/s3/m/cd95ee776bec0975f565e2bf.png)
图论实验三个案例单源最短路径问题 1.1 Dijkstra 算法Dijkstra 算法是解单源最短路径问题的一个贪心算法。
其基本思想是,设置一个顶点集合S 并不断地作贪心选择来扩充这个集合。
一个顶点属于集合S 当且仅当从源到该顶点的最短路径长度已知。
设v 是图中的一个顶点,记()l v 为顶点v 到源点v 1的最短距离,,i j v v V∀∈,若(,)i j v v E∉,记i v 到jv 的权ij w =∞。
Dijkstra 算法:① 1{}S v =,1()0l v =;1{}v V v ∀∉-,()l v =∞,1i =,1{}S V v =-; ② S φ=,停止,否则转③;③()min{(),(,)}j l v l v d v v =,j v S∈,v S ∀∈;④ 存在1i v +,使1()min{()}i l v l v +=,v S ∈; ⑤ 1{}i S S v +=,1{}i S S v +=-,1i i =+,转②; 实际上,Dijkstra 算法也是最优化原理的应用:如果121n n v v v v -是从1v 到nv 的最短路径,则121n v v v -也必然是从1v 到1n v -的最优路径。
在下面的MATLAB 实现代码中,我们用到了距离矩阵,矩阵第i 行第j 行元素表示顶点i v 到jv 的权ijw ,若i v 到jv 无边,则realmaxij w =,其中realmax 是MATLAB 常量,表示最大的实数(1.7977e+308)。
function re=Dijkstra(ma)%用Dijkstra算法求单源最短路径%输入参量ma是距离矩阵%输出参量是一个三行n列矩阵,每列表示顶点号及顶点到源的最短距离和前顶点n=size(ma,1);%得到距离矩阵的维数s=ones(1,n);s(1)=0;%标记集合S和S的补r=zeros(3,n);r(1,:)=1:n;r(2,2:end)=realmax;%初始化for i=2:n;%控制循环次数mm=realmax;for j=find(s==0);%集合S中的顶点for k=find(s==1);%集合S补中的顶点if(r(2,j)+ma(j,k)<r(2,k))r(2,k)=r(2,j)+ma(j,k);r(3,k)=j;endif(mm>r(2,k))mm=r(2,k);t=k;endendends(1,t)=0;%找到最小的顶点加入集合S end re=r;1.2 动态规划求解最短路径动态规划是美国数学家Richard Bellman 在1951年提出来的分析一类多阶段决策过程的最优化方法,在工程技术、工业生产、经济管理、军事及现代化控制工程等方面均有着广泛的应用。
dijkstra算法缺点及matlab程序
![dijkstra算法缺点及matlab程序](https://img.taocdn.com/s3/m/847cc718a8114431b90dd876.png)
Dijkstra算法Dijkstra(迪杰斯特拉)算法是典型的最短路径路由算法,用于计算一个节点到其他所有节点的最短路径。
主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。
其基本原理是:每次新扩展一个距离最短的点,更新与其相邻的点的距离。
当所有边权都为正时,由于不会存在一个距离更短的没扩展过的点,所以这个点的距离永远不会再被改变,因而保证了算法的正确性。
不过根据这个原理,用Dijkstra求最短路的图不能有负权边,因为扩展到负权边的时候会产生更短的距离,有可能就破坏了已经更新的点距离不会改变的性质。
Dijkstra 算法能得出最短路径的最优解,但由于它遍历计算的节点很多,所以效率低。
Dijkstra算法是很有代表性的最短路算法,在很多专业课程中都作为基本内容有详细的介绍,如数据结构,图论,运筹学等等。
Dijkstra一般的表述通常有两种方式,一种用永久和临时标号方式,一种是用OPEN, CLOSE表方式,Drew为了和下面要介绍的A* 算法和D* 算法表述一致,这里均采用OPEN,CLOSE表的方式。
其采用的是贪心法的算法策略大概过程:创建两个表,OPEN, CLOSE。
OPEN表保存所有已生成而未考察的节点,CLOSED表中记录已访问过的节点。
1.访问路网中距离起始点最近且没有被检查过的点,把这个点放入OPEN 组中等待检查。
2.从OPEN表中找出距起始点最近的点,找出这个点的所有子节点,把这个点放到CLOSE表中。
3.遍历考察这个点的子节点。
求出这些子节点距起始点的距离值,放子节点到OPEN表中。
4.重复第2和第3步,直到OPEN表为空,或找到目标点。
①function [l,z]=Dijkstra(W)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<ii=j-1;endendendi=i+1;end% W =[ 0 2 1 8 Inf Inf Inf Inf % 2 0 Inf 6 1 Inf InfInf% 1 Inf 0 7 Inf Inf 9 Inf% 8 6 7 0 5 12 Inf% Inf 1 Inf 5 0 3 Inf9% Inf Inf Inf 1 3 0 46% Inf Inf 9 2 Inf 4 03% Inf Inf Inf Inf 9 6 30 ];②========================================================Dijkstra的matlab实现代码=========================================================function [d,DD]=dijkstra(D,s)%Dijkstra最短路算法Matlab程序用于求从起始点s到其它各点的最短路%D为赋权邻接矩阵%d为s到其它各点最短路径的长度%DD记载了最短路径生成树[m,n]=size(D);d=inf.*ones(1,m);d(1,s)=0;dd=zeros(1,m);dd(1,s)=1;y=s;DD=zeros(m,m);DD(y,y)=1;counter=1;while length(find(dd==1))<Mfor i=1:mif dd(i)==0d(i)=min(d(i),d(y)+D(y,i));endendddd=inf;for i=1:mif dd(i)==0&&d(i)<DDDddd=d(i);endendyy=find(d==ddd);counter=counter+1;DD(y,yy(1,1))=counter;DD(yy(1,1),y)=counter;y=yy(1,1);dd(1,y)=1;end③没有用过这个算法,请大家指点一下对于下面的路径矩阵怎样求取从1到7的最短路径的使用方法(急着用,谢谢了):%关键在于怎样输出途经结点或边的位置1~9clear;clc;ko=10000;mp(1,:)=[0 628.4 400 ko ko ko 728.4 ko ko];mp(2,:)=[zeros(1,2) ko 900 ko ko ko ko ko];mp(3,:)=[zeros(1,3) ko ko 700 ko ko ko];mp(4,:)=[zeros(1,4) 400 ko ko ko ko];mp(5,:)=[zeros(1,5) ko ko ko 628.4];mp(6,:)=[zeros(1,6) ko ko 200];mp(7,:)=[zeros(1,7) 800 ko];mp(8,:)=[zeros(1,8) 1028.4];mp(9,:)=zeros(1,9);mr=mp+mp';附:dijkstra算法代码[m,n]=size(D);d=inf.*ones(1,m);d(1,s)=0;dd=zeros(1,m);dd(1,s)=1;y=s;DD=zeros(m,m);DD(y,y)=1;counter=1;while length(find(dd==1))<Mfor i=1:mif dd(i)==0d(i)=min(d(i),d(y)+D(y,i));endendddd=inf;for i=1:mif dd(i)==0&&d(i)<DDDddd=d(i);endendyy=find(d==ddd);counter=counter+1;DD(y,yy(1,1))=counter;DD(yy(1,1),y)=counter;y=yy(1,1);dd(1,y)=1;endFloyd算法描述:设A = (aij )n×n为赋权图G = (V, E, F)的权矩阵, dij表示从vi到vj点的距离, rij表示从vi到vj点的最短路中一个点的编号.①赋初值. 对所有i, j, dij = aij, rij = j. k = 1. 转向②.②更新dij , rij . 对所有i, j, 若dik + dk j<dij , 则令dij = dik + dkj , rij = k, 转向③;③终止判断. 若k = n终止; 否则令k = k + 1, 转向②.最短路线可由rij得到.Matlab程序:%floyd1.m文件function [d,r1]=floyd1(vx,vy)b=inf;a= [ 0 2 8 1 b b b b2 0 6 b 1 b b b8 6 0 7 5 1 2 b1 b 7 0 b b 9 bb 1 5 b 0 3 b 8b b 1 b 3 0 4 6b b 2 9 b 4 0 3b b b b 8 6 3 0 ];d=a;vx=vx+1;vy=vy+1;global r;r=a;for i=1:8for j=1:8d(i,j)=a(i,j);r(i,j)=j;k=1;endendfor k=1:8for i=1:8for j=1:8if d(i,k)+d(k,j)<d(i,j)d(i,j)=d(i,k)+d(k,j);r(i,j)=k;endendendendr1=r-1;fun3(vx,vy);%fun3.m文件function fun3(vx,vy)global rt=r(vx,vy);if vy==treturnelsefun3(vx,t);disp(t-1);fun3(t,vy);end。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
最短路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.
clc
s=1;
t=5;
flag=1;
W=ones(11,11)*inf; %
for i=1:11
W(i,i)=0;
end
W(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);
c0
path0
调用matlab函数dijkstra(具体见本文库文档:最短路dijkstra算法Matlab程序), 可得到顶点v1 到顶点v5的最短路径path0及最短路径的长度c0如下:
c0 = 13
path0 = 1 2 3 10 9 7 6 11 5
如果将上述程序中的语句
flag=1;
替换为
flag=2;
并将
[c0,c,path0,path]=dijkstra(s,t,C,flag);
c0
path0
替换为
[c0,c,path0,path]=dijkstra(s,t,C,flag);
c
path
运行程序可得到顶点v1到图中其他各顶点的最短路径所成矩阵path和各最短路径的长度所成向量c,其中path的第i行表示v1到第i个顶点的最短路径,c(i) 为v1到第i个顶点的最短路径的长度。
具体运算结果如下:
c =
0 2 3 5 13 10 9 1 7 6 11
path =
1 0 0 0 0 0 0 0 0 0 0
1 2 0 0 0 0 0 0 0 0 0
1 2 3 0 0 0 0 0 0 0 0
1 2 3 4 0 0 0 0 0 0 0
1 2 3 10 9 7 6 11 5 0 0
1 2 3 10 9 7 6 0 0 0 0
1 2 3 10 9 7 0 0 0 0 0
1 8 0 0 0 0 0 0 0 0 0
1 2 3 10 9 0 0 0 0 0 0
1 2 3 10 0 0 0 0 0 0 0
1 2 3 10 9 7 6 11 0 0 0 此外,改变程序中变量s和t的取值,可以得到其他顶点之间的最短路径。