dbdhdbbfc 2022-06-26 14:27 采纳率: 100%
浏览 50
已结题

一个问题算法的程序出现错误运行不出来

function [min,path]=dijkstra(w,start,terminal)
%输入变量w为所求图的带权邻接矩阵,start、terminal分别为路径的起点和终点的编号。
%返回path为从start到termial的最短路径以及长度min

n=size(w,1); label(start)=0; f(start)=start;
%n为所求图的顶点个数,label存放到各点的最短路径,f(v)表示v的父顶点用来还原路径

%初始化将除了start以外的顶点label均设置为无穷大
for i=1:n
if i~=start
label(i)=inf;
end
end

%s数组存放已经搜好的顶点集,初始化只有start
s(1)=start; u=start;
while length(s)<n
%遍历一遍顶点,将不在顶点集中的顶点选出来进行下面的if判定
for i=1:n
ins=0;
for j=1:length(s)
if i==s(j)
ins=1;
end
end
%判断是否有中继顶点使得它们之间的距离更短,如果有的话更新距离并更新前驱结点
if ins==0
v=i;
if label(v)>(label(u)+w(u,v))
label(v)=(label(u)+w(u,v)); f(v)=u;
end
end
end
v1=0;
k=inf;
%同上再次进行遍历,找到目前最短的路径顶点v1,放入顶点集并改变u的值
for i=1:n
ins=0;
for j=1:length(s)
if i==s(j)
ins=1;
end
end
if ins==0
v=i;
if k>label(v)
k=label(v); v1=v;
end
end
end
s(length(s)+1)=v1;
u=v1;
end

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);

img

img

  • 写回答

2条回答 默认 最新

  • 颖淑 2022-06-28 02:00
    关注

    按照你这个matlab代码:

    function [min,path]=dijkstra(w,start,terminal)
    %% 函数介绍
    %输入变量w为所求图的带权邻接矩阵,start、terminal分别为路径的起点和终点的编号。
    %返回path为从start到termial的最短路径以及长度min
    n=size(w,1); label(start)=0; f(start)=start;
    %n为所求图的顶点个数,label存放到各点的最短路径,f(v)表示v的父顶点用来还原路径
    %初始化将除了start以外的顶点label均设置为无穷大
    for i=1:n
    if i~=start
    label(i)=inf;
    end
    end
    %s数组存放已经搜好的顶点集,初始化只有start
    s(1)=start; u=start;
    while length(s)<n
    %遍历一遍顶点,将不在顶点集中的顶点选出来进行下面的if判定
    for i=1:n
    ins=0;
    for j=1:length(s)
    if i==s(j)
    ins=1;
    end
    end
    %判断是否有中继顶点使得它们之间的距离更短,如果有的话更新距离并更新前驱结点
    if ins==0
    v=i;
    if label(v)>(label(u)+w(u,v))
    label(v)=(label(u)+w(u,v)); f(v)=u;
    end
    end
    end
    v1=0;
    k=inf;
    %同上再次进行遍历,找到目前最短的路径顶点v1,放入顶点集并改变u的值
    for i=1:n
    ins=0;
    for j=1:length(s)
    if i==s(j)
    ins=1;
    end
    end
    if ins==0
    v=i;
    if k>label(v)
    k=label(v); v1=v;
    end
    end
    end
    s(length(s)+1)=v1;
    u=v1;
    end
    
    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);
    

    并根据你给的点,我写了个命令窗口代码:

    clc,clear
    w=[0,0.8,2,3.8,6;inf,0,0.9,2.1,3.9;inf,inf,0,1.1,2.3;inf,inf,inf,0,1.4;inf,inf,inf,inf,0];
    start=1;
    terminal=5;
    [min,path]=dijkstra(w,start,terminal);
    min,path
    

    运行得出的结果是:

    img


    并没有产生报错。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 7月7日
  • 已采纳回答 6月29日
  • 创建了问题 6月26日

悬赏问题

  • ¥20 西门子S7-Graph,S7-300,梯形图
  • ¥50 用易语言http 访问不了网页
  • ¥50 safari浏览器fetch提交数据后数据丢失问题
  • ¥15 matlab不知道怎么改,求解答!!
  • ¥15 永磁直线电机的电流环pi调不出来
  • ¥15 用stata实现聚类的代码
  • ¥15 请问paddlehub能支持移动端开发吗?在Android studio上该如何部署?
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效
  • ¥15 悬赏!微信开发者工具报错,求帮改