用MATLAB写dijkstra算法(求简单的最短路问题)

在MATLAB里面,我们用邻接矩阵来表示一个有向图之间的节点与节点之间的距离。

假如我们现在有六个节点,他们之间的距离如下表所示:

0 50 40 25 10
50 0 15 20 25
15 0 10 20
40 20 10 0 10 25
25 20 10 0 55
10 25 25 55 0

下面先写个Dijkstra算法的文件,方便之后直接调用:

function[mydijkstra,mypath]  = mydijkstra(a,sb,db);
%a是表示图的邻接矩阵,sb是起点,db是终点

n = size(a,1);      %n是整个图的大小
visited(1:n) = 0;
distance(1:n) = inf;
distance(sb) = 0;%distance是表示起点到当前角标点的最小距离,所以起点到起点为0
visited(sb) = 1;    %将起点标记为1
u = sb;     %u为最新的标号顶点
parent(1:n) = 0;%前驱顶点的初始化
for i = 1:n-1
    id = find(visited == 0);%查找未标号的顶点
    for v = id
        if a(u,v)+distance(u)<distance(v)
            distance(v)=distance(u)+a(u,v);
            parent(v)=u;%表示v的父节点是u
        end
    end
    temp = distance;
    temp(visited == 1) = inf;%自己到自己的距离设为INF
    [t,u] = min(temp);%temp是一个数组,t是取得的这个数组的最小值,u则是这个最小值对应的角标
    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)
mypath

代码的输入是:

  1. 邻接矩阵
  2. 起点
  3. 终点

代码注释的很详细,可以步进看一下具体怎么操作的。

其实就是,比如我们算1-3的距离,首先找出来的是1到那个点最近,然后再从那个点出发再去找最近的点。distance数组存放的是这个起点到这个节点的最近距离,所以这样就保证了该节点位置上的值一定是最短的路径值。parent数组存放的是当前这个角标位置的父节点,如果这个父节点不为空 ,那么这个就一定存在路径。

下面用上面那个表格的数据来测试:

>> a = zeros(6);
a(1,2) = 50;
a(1,4) = 40;
a(1,5) = 25;
a(1,6) = 10;
a(2,3) = 15;
a(2,4) = 20;
a(2,6) = 25;
a(3,4) = 10;
a(3,5) = 20;
a(4,5) = 10;
a(4,6) = 25;
a(5,6) = 55;
a = a+a'
a(a==0)=inf
a(1,1) = 0;
a(2,2) = 0;
a(3,3) = 0;
a(4,4)= 0;
a(5,5) = 0;
a(6,6) = 0;
>> dijkstra(a,1,3)

输出为:

mydistance =

    45


mypath =

     1     5     3

昨天开始用MATLAB写代码,不当之处欢迎大佬多多指点

你可能感兴趣的:(MATLAB)