Dijkstra算法 MATLAB

MATLAB画路径图全部数据该链接是建模时所有的代码,包括最短路径的问题以及利用MATLAB画结点图的代码和数据

function [min,path] =dijkstra(w,start,terminal)

n=size(w,1);

label(start)=0;

for i=1:n

    if i~=start

        label(i)=inf;

    end

end

s(1)=start;

u=start;

while length(s)<n

    for i=1:n

        ins=0;

        for j=1:length(s)

            if i==s(j)

                ins=1;

            end

        end

        if ins==0

            v=i;

            iflabel(v)>(label(u)+w(u,v))

               label(v)=(label(u)+w(u,v));

                f(v)=u;

            end

        end

    end

    v1=0;

    k=inf;

    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;

n = 130;

w = xlsread('TimedataC.xlsx');

M = max(max(w)) * n^2;

w = w + ((w == 0) - eye(130)) * M;

for i = 9:68

    for j = 1:2

        [min,path] =dijkstra(w,i,j);

        D(i-8,j) = min;

        len = length(path);

        for k = 1:len

            P(2 * (i - 9) + j,k)= path(1,k);

        end

    end

end

fprintf('DONE!');

xlswrite('C-D-Fshortesttime.xlsx',D);//结果最终体现,文档中对应的每个点之间最短距离
xlswrite('C-D-Ftimepass.xlsx',P);


  • 1
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Dijkstra算法是一种用于计算图中最短路径的算法。它的思路是从起点出发,逐步确定到达每个顶点的最短路径,并最终得到最短路径的长度和路径本身。Dijkstra算法的具体实现可以使用Matlab编程语言来实现,通过邻接矩阵表示图,并利用循环和条件判断等语句来实现算法的逻辑。以下是一个简单的Dijkstra算法Matlab实现示例: ``` function [mydistance, mypath] = mydijkstra(a, sb, db) % 输入:a——邻接矩阵;a(i,j)——i到j之间的距离,可以是有向的 % sb——起点的标号,db——终点的标号 % 输出:mydistance——最短路的距离,mypath——最短路的路径 n = size(a, 1); visited(1:0) = 0; distance(1:n) = inf; distance(sb) = 0; % 起点到各顶点距离的初始化 visited(sb) = 1; u = sb; % u为最新的S集合顶点 parent(1:0) = 0; % 前驱顶点的初始化 for i = 1:n - 1 id = find(visited == 0); % 查找V-S集合的顶点 for v = id if a(u, v) + distance(u) < distance(v) % 修改标号值 distance(v) = a(u, v) + distance(u); parent(v) = u; end end temp = distance; temp(visited == 1) = inf; % 已标号点的距离换成无穷大 [t, u] = min(temp); % 找标号值最小的顶点 visited(u) = 1; % 标记已经标号的顶点 end mypath = []; if parent(db) ~= 0 % 如果存在路! t = db; mypath = [db]; while t ~= sb P = parent(t); mypath = [P mypath]; t = P; end end mydistance = distance(db); ``` 以上是一个简单的Dijkstra算法Matlab实现示例,您可以根据实际需求进行修改和扩展。希望对您有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值