问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

求利用matlab求从A到O的最短路径的程序代码~~~

发布网友 发布时间:2022-04-24 01:58

我来回答

1个回答

热心网友 时间:2023-10-20 10:56

function R=main_Dj()
clc;clear
G=[1 2 5;1 4 1;2 3 1;2 4 6;2 5 5.8;2 6 5.7;2 7 5.6;3 7 2; 3 11 1.5; 3 12 4;...
    4 5 0.5;4 8 3; 5 6 1;5 9 3;6 7 0.6;6 10 2.5; 7 11 2.7;8 9 1;8 12 6;...
    9 10 1.5;9 12 5;10 11 0.5;10 12 4;11 12 3];
opt=0;
route=sroute(G,opt);
R=[];
r=route(3,end);
R=[r,R];
while r~=1
  r=route(3,r);
  R=[r,R];
end
R=char(R+64);
R=[R,'O'];


end
function route=sroute(G,opt)
% 求图的最短路的Dijkstra算法,规定1是起点
% G是给定图的邻接矩阵或弧表矩阵,程序能够自动识别
% 当opt=0(或缺省)时求无向图的最短路,opt=1时求有向图的最短路
% d——标记最短距离 
% route是一个矩阵,第一行标记顶点,第2行标记1到该点的最短距离,
% 第3行标记最短路上该点的先驱顶点
if (nargin==1) opt=0; end
while 1      % 此循环自动识别或由弧表矩阵生成邻接矩阵
   if G(1,1)==0
      A=G;
      n=size(A,1);
      M=sum(sum(A));break
   else
      e=G;
      n=max([e(:,1);e(:,2)]);          % 顶点数
      m=size(e,1);                     % 边数
      M=sum(e(:,3));                   % 代表无穷大
      A=M*ones(n,n);
      for k=1:m
          A(e(k,1),e(k,2))=e(k,3);  
          if opt==0 
               A(e(k,2),e(k,1))=e(k,3); % 形成无向图的邻接矩阵
          end         
      end
      A=A-M*eye(n);                      % 形成图的邻接矩阵      
   end
   break
end
pb(1:length(A))=0;pb(1)=1;               % 永久标号点记为1
index1=1;                                % 依次记录永久标号顶点
index2=ones(1,length(A));                % 标记最短路上各点的先驱顶点
d(1:length(A))=M;d(1)=0;                 % 标记距离
temp=1;                                  % 标记最近一个永久标号点
while sum(pb)<length(A)
   tb=find(pb==0);                       % 找出临时标号点
   d(tb)=min(d(tb),d(temp)+A(temp,tb));  % 更新距离
   tmpb=find(d(tb)==min(d(tb)));         % 确定新最小距离点
   temp=tb(tmpb(1));                     % 其中之一记为新永久标号点
   pb(temp)=1;                           % 增加新永久标号点
   index1=[index1,temp];                 % 记录新永久标号点
   index=index1(find(d(index1)==d(temp)-A(index1,temp)')); % 确定前驱顶点
   if length(index)>=2                   % 前驱顶点多于1个时取第一个
      index=index(1);
   end
   index2(temp)=index;                   % 记录前驱顶点
end
route=[1:n; d; index2];

end

运行结果
R =

ADEFJKO
代码自己看,不解释,也别叫我解释了,很麻烦的。

热心网友 时间:2023-10-20 10:56

function R=main_Dj()
clc;clear
G=[1 2 5;1 4 1;2 3 1;2 4 6;2 5 5.8;2 6 5.7;2 7 5.6;3 7 2; 3 11 1.5; 3 12 4;...
    4 5 0.5;4 8 3; 5 6 1;5 9 3;6 7 0.6;6 10 2.5; 7 11 2.7;8 9 1;8 12 6;...
    9 10 1.5;9 12 5;10 11 0.5;10 12 4;11 12 3];
opt=0;
route=sroute(G,opt);
R=[];
r=route(3,end);
R=[r,R];
while r~=1
  r=route(3,r);
  R=[r,R];
end
R=char(R+64);
R=[R,'O'];


end
function route=sroute(G,opt)
% 求图的最短路的Dijkstra算法,规定1是起点
% G是给定图的邻接矩阵或弧表矩阵,程序能够自动识别
% 当opt=0(或缺省)时求无向图的最短路,opt=1时求有向图的最短路
% d——标记最短距离 
% route是一个矩阵,第一行标记顶点,第2行标记1到该点的最短距离,
% 第3行标记最短路上该点的先驱顶点
if (nargin==1) opt=0; end
while 1      % 此循环自动识别或由弧表矩阵生成邻接矩阵
   if G(1,1)==0
      A=G;
      n=size(A,1);
      M=sum(sum(A));break
   else
      e=G;
      n=max([e(:,1);e(:,2)]);          % 顶点数
      m=size(e,1);                     % 边数
      M=sum(e(:,3));                   % 代表无穷大
      A=M*ones(n,n);
      for k=1:m
          A(e(k,1),e(k,2))=e(k,3);  
          if opt==0 
               A(e(k,2),e(k,1))=e(k,3); % 形成无向图的邻接矩阵
          end         
      end
      A=A-M*eye(n);                      % 形成图的邻接矩阵      
   end
   break
end
pb(1:length(A))=0;pb(1)=1;               % 永久标号点记为1
index1=1;                                % 依次记录永久标号顶点
index2=ones(1,length(A));                % 标记最短路上各点的先驱顶点
d(1:length(A))=M;d(1)=0;                 % 标记距离
temp=1;                                  % 标记最近一个永久标号点
while sum(pb)<length(A)
   tb=find(pb==0);                       % 找出临时标号点
   d(tb)=min(d(tb),d(temp)+A(temp,tb));  % 更新距离
   tmpb=find(d(tb)==min(d(tb)));         % 确定新最小距离点
   temp=tb(tmpb(1));                     % 其中之一记为新永久标号点
   pb(temp)=1;                           % 增加新永久标号点
   index1=[index1,temp];                 % 记录新永久标号点
   index=index1(find(d(index1)==d(temp)-A(index1,temp)')); % 确定前驱顶点
   if length(index)>=2                   % 前驱顶点多于1个时取第一个
      index=index(1);
   end
   index2(temp)=index;                   % 记录前驱顶点
end
route=[1:n; d; index2];

end

运行结果
R =

ADEFJKO
代码自己看,不解释,也别叫我解释了,很麻烦的。

热心网友 时间:2023-10-20 10:56

function R=main_Dj()
clc;clear
G=[1 2 5;1 4 1;2 3 1;2 4 6;2 5 5.8;2 6 5.7;2 7 5.6;3 7 2; 3 11 1.5; 3 12 4;...
    4 5 0.5;4 8 3; 5 6 1;5 9 3;6 7 0.6;6 10 2.5; 7 11 2.7;8 9 1;8 12 6;...
    9 10 1.5;9 12 5;10 11 0.5;10 12 4;11 12 3];
opt=0;
route=sroute(G,opt);
R=[];
r=route(3,end);
R=[r,R];
while r~=1
  r=route(3,r);
  R=[r,R];
end
R=char(R+64);
R=[R,'O'];


end
function route=sroute(G,opt)
% 求图的最短路的Dijkstra算法,规定1是起点
% G是给定图的邻接矩阵或弧表矩阵,程序能够自动识别
% 当opt=0(或缺省)时求无向图的最短路,opt=1时求有向图的最短路
% d——标记最短距离 
% route是一个矩阵,第一行标记顶点,第2行标记1到该点的最短距离,
% 第3行标记最短路上该点的先驱顶点
if (nargin==1) opt=0; end
while 1      % 此循环自动识别或由弧表矩阵生成邻接矩阵
   if G(1,1)==0
      A=G;
      n=size(A,1);
      M=sum(sum(A));break
   else
      e=G;
      n=max([e(:,1);e(:,2)]);          % 顶点数
      m=size(e,1);                     % 边数
      M=sum(e(:,3));                   % 代表无穷大
      A=M*ones(n,n);
      for k=1:m
          A(e(k,1),e(k,2))=e(k,3);  
          if opt==0 
               A(e(k,2),e(k,1))=e(k,3); % 形成无向图的邻接矩阵
          end         
      end
      A=A-M*eye(n);                      % 形成图的邻接矩阵      
   end
   break
end
pb(1:length(A))=0;pb(1)=1;               % 永久标号点记为1
index1=1;                                % 依次记录永久标号顶点
index2=ones(1,length(A));                % 标记最短路上各点的先驱顶点
d(1:length(A))=M;d(1)=0;                 % 标记距离
temp=1;                                  % 标记最近一个永久标号点
while sum(pb)<length(A)
   tb=find(pb==0);                       % 找出临时标号点
   d(tb)=min(d(tb),d(temp)+A(temp,tb));  % 更新距离
   tmpb=find(d(tb)==min(d(tb)));         % 确定新最小距离点
   temp=tb(tmpb(1));                     % 其中之一记为新永久标号点
   pb(temp)=1;                           % 增加新永久标号点
   index1=[index1,temp];                 % 记录新永久标号点
   index=index1(find(d(index1)==d(temp)-A(index1,temp)')); % 确定前驱顶点
   if length(index)>=2                   % 前驱顶点多于1个时取第一个
      index=index(1);
   end
   index2(temp)=index;                   % 记录前驱顶点
end
route=[1:n; d; index2];

end

运行结果
R =

ADEFJKO
代码自己看,不解释,也别叫我解释了,很麻烦的。

热心网友 时间:2023-10-20 10:56

function R=main_Dj()
clc;clear
G=[1 2 5;1 4 1;2 3 1;2 4 6;2 5 5.8;2 6 5.7;2 7 5.6;3 7 2; 3 11 1.5; 3 12 4;...
    4 5 0.5;4 8 3; 5 6 1;5 9 3;6 7 0.6;6 10 2.5; 7 11 2.7;8 9 1;8 12 6;...
    9 10 1.5;9 12 5;10 11 0.5;10 12 4;11 12 3];
opt=0;
route=sroute(G,opt);
R=[];
r=route(3,end);
R=[r,R];
while r~=1
  r=route(3,r);
  R=[r,R];
end
R=char(R+64);
R=[R,'O'];


end
function route=sroute(G,opt)
% 求图的最短路的Dijkstra算法,规定1是起点
% G是给定图的邻接矩阵或弧表矩阵,程序能够自动识别
% 当opt=0(或缺省)时求无向图的最短路,opt=1时求有向图的最短路
% d——标记最短距离 
% route是一个矩阵,第一行标记顶点,第2行标记1到该点的最短距离,
% 第3行标记最短路上该点的先驱顶点
if (nargin==1) opt=0; end
while 1      % 此循环自动识别或由弧表矩阵生成邻接矩阵
   if G(1,1)==0
      A=G;
      n=size(A,1);
      M=sum(sum(A));break
   else
      e=G;
      n=max([e(:,1);e(:,2)]);          % 顶点数
      m=size(e,1);                     % 边数
      M=sum(e(:,3));                   % 代表无穷大
      A=M*ones(n,n);
      for k=1:m
          A(e(k,1),e(k,2))=e(k,3);  
          if opt==0 
               A(e(k,2),e(k,1))=e(k,3); % 形成无向图的邻接矩阵
          end         
      end
      A=A-M*eye(n);                      % 形成图的邻接矩阵      
   end
   break
end
pb(1:length(A))=0;pb(1)=1;               % 永久标号点记为1
index1=1;                                % 依次记录永久标号顶点
index2=ones(1,length(A));                % 标记最短路上各点的先驱顶点
d(1:length(A))=M;d(1)=0;                 % 标记距离
temp=1;                                  % 标记最近一个永久标号点
while sum(pb)<length(A)
   tb=find(pb==0);                       % 找出临时标号点
   d(tb)=min(d(tb),d(temp)+A(temp,tb));  % 更新距离
   tmpb=find(d(tb)==min(d(tb)));         % 确定新最小距离点
   temp=tb(tmpb(1));                     % 其中之一记为新永久标号点
   pb(temp)=1;                           % 增加新永久标号点
   index1=[index1,temp];                 % 记录新永久标号点
   index=index1(find(d(index1)==d(temp)-A(index1,temp)')); % 确定前驱顶点
   if length(index)>=2                   % 前驱顶点多于1个时取第一个
      index=index(1);
   end
   index2(temp)=index;                   % 记录前驱顶点
end
route=[1:n; d; index2];

end

运行结果
R =

ADEFJKO
代码自己看,不解释,也别叫我解释了,很麻烦的。

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
电视般有哪些尺寸 电视有哪些尺寸 寓意生命力顽强的男孩名字 美国产生金融危机了,铁矿石回降价吗? 铁矿石什么情况下会跌 从生物学的角度看,随地吐痰的主要危害是什么 随地吐痰会给我们带来什么样的危害? 痰是怎样形成的,随地吐痰有哪些危害 得力挂钟为什么不走了 人民大学、外交学院、中国政法、北京大学、复旦、华东政法等大学法学... 面包中的酵母有哪些品牌? matlab求最短路,运行dijkstra函数时出错 面包酵母是什么 做面包用什么酵母 华为手机p40的耳机模式在哪里关闭 MATLAB 求最短路径问题 请教matlab中的最短路径函数 如何用matlab求每对顶点之间的最短路径 matlab求最短路,运行dijkstra函数 用matlab最短路 matlab的最短路径 求代码 matlab求,最短路 matlab求最短路径 微信加密软件哪个比较好 微信可以隐藏某个微信聊天记录但不删除吗? 如何处理化工业废气? 工厂排出的废气应该怎么处理?需要做些什么? 如何净化废气? 废气的种类(详细) 废气污染物的主要成分及其危害? 废气的处理方法有哪些? 苹果手机在手机上怎么查看是港版和国行? 华为p40耳机怎么设置 半年以前的所有聊天记录包括图片视频可以找回吗? matlab求最短距离问题 matlab编程动态规划最短路径问题 matlab求最短路德程序编辑出来了,为什么运行不了 在快手极速版上点了弹幕会出现什么 求各位高手Matlab dijkstra 算法的使用方法。 酵母在面包中起到什么作用 一个5000乘上5000的稀疏矩阵,如何利用MATLAB求解平均最短路径,算法要求用dijkstra 如何辨别苹果手机国行和港行 酵母在面包中起什么作用? dijkstra 的MATLAB算法 最短路 制作面包的时候会用到酵母,那鲜酵母和干酵母有什么区别? 图论最短路问题的Dijkstra算法与Matlab程序? 酵母在面包中的作用? 谁能帮我写一个用matlab求两点用之间的最短路程序,要求输出经过一次中转,经过两次中转时的最短路和路由 面包机酵母什么牌子好 2011数学建模国赛B题 求MATLAB最短路工具箱或者算法~发邮箱 快手极速版的放映厅在哪里