matlab练习程序(单源最短路径Bellman-Ford)

该算法可以用来解决一般(边的权值为负)的单源最短路径问题,而dijkstra只能解决权值非负的情况。

此算法使用松弛技术,对每一个顶点,逐步减少源到该顶点的路径的估计值,直到达到最短的路径。

算法运算结果:

matlab练习程序(单源最短路径Bellman-Ford)

matlab练习程序(单源最短路径Bellman-Ford)

matlab代码如下,netplot函数在这里,不过当时函数中表示两节点没有路径用的是0,而现在需要改成inf:

clear all;close all;clc

%初始化邻接压缩表

b=[1 2 6;

   1 4 7 

   2 3 5;

   2 4 8;

   2 5 -4;

   3 2 -2;

   4 3 -3;

   4 5 9;

   5 1 2;

   5 3 7];



m=max(max(b(:,1:2)));            %压缩表中最大值就是邻接矩阵的宽与高

A=compresstable2matrix(b);  %从邻接压缩表构造图的矩阵表示

netplot(A,1)                %形象表示



S=inf(1,m);                 %源到其他节点的最短距离,开始为inf

S(1)=0;                     %源点到自己的距离为0

pa=zeros(1,m);              %寻找到的节点的前趋

pa(1)=1;                    %源点的前趋是自己



pre_pa=ones(1,m);

while sum(pre_pa==pa)~=m    %终止条件,判断终止的方法很多,这个应该不是最佳实践

    pre_pa=pa;

    for k=1:m

        if pre_pa(k)~=0                 %对每一个已搜寻到的节点,从此节点寻找后继节点

            i=k;                

            for j=1:m

                if A(i,j)~=inf

                    if S(j)>S(i)+A(i,j)

                        S(j)=S(i)+A(i,j);       %边缘松弛,取两节点间最小权值作为实际权值

                        pa(j)=i;                %寻找前趋

                    end

                end

            end

         end

    end

end

%最终我们需要的就是这两个值

S       %源点到其他每一点的距离

pa      %其他每一节点的前趋



%算法到此结束,下面只是为了形象的表示而写的。

re=[];

for i=2:m

    re=[re;pa(i) i A(pa(i),i)];

end

A=compresstable2matrix(re);  %从邻接压缩表构造图的矩阵表示

figure;

netplot(A,1)                %形象表示

 compresstable2matrix.m

function A=compresstable2matrix(b)

    [n ~]=size(b);

    m=max(max(b(:,1:2)));

    A=inf(m,m);



    for i=1:n

        A(b(i,1),b(i,2))=b(i,3);

    end



end

 

你可能感兴趣的:(matlab)