Floyd多源最短路径算法

一、理论基础

Floyd算法是解决任意两点间的最短路径的一种算法,可以正确处理有向图或有向图或负权(但不可存在负权回路)的最短路径问题。
在Floyd算法中一般有两个矩阵,一个距离矩阵 D D D,一个路由矩阵 R R R,其中距离矩阵用于存储任意两点之间的最短距离,而路由矩阵则记录任意两点之间的最短路径信息。
其思想是:如果可以从一个点进行中转,就进行比较从这个点中转和不中转的距离,存储距离小的情况,并更新距离矩阵和路由矩阵。
从算法思想中我们可以大概推断我们要遍历 n n n个中转点,在每个中转点进行操作的时候,需要对任意两点之间 的距离进行遍历。那么算法就应该有三重循环,第一重循环是遍历中转点,第二重和第三重循环是遍历任意两个点之间的距离。假设中转节点为K,如果: D ( i , k ) + D ( k , j ) < D ( i , j ) D(i,k)+D(k,j)D(i,k)+D(k,j)<D(i,j)其中 D ( i , k ) + D ( k , j ) D(i,k)+D(k,j) D(i,k)+D(k,j)表示 i i i j j j k k k中转的距离, D ( i , j ) D(i,j) D(i,j)表示从 i i i j j j的最短距离,如果前者比后者小,那么就 D ( i , j ) D(i,j) D(i,j)进行更新: D ( i , j ) = D ( i , k ) + D ( k , j ) D(i,j)=D(i,k)+D(k,j) D(i,j)=D(i,k)+D(k,j),这样就更新了距离矩阵;并且更新路由矩阵: R ( i , j ) = R ( i , k ) R(i,j)=R(i,k) R(i,j)=R(i,k)
更多细节请参考:https://blog.csdn.net/kabuto_hui/article/details/82886826

二、MATLAB实现

代码如下:

clear;clc;
a = [0 2 6 4;
    inf 0 3 inf;
    7 inf 0 1 ;
    5 inf 12 0];
[d, r] = floyd(a)
disp('--------------------------')
for i = 1:4
    for j = 1:4
        DisplayPath(r, i, j);
    end
end
function [d, r] = floyd(a)
%% 采用floyd算法计算图a中每对顶点最短路
% d是矩离矩阵
% r是路由矩阵
n = size(a, 1);
% 初始化距离矩阵
d = a;
% 初始化路由矩阵
for i = 1:n
    for j = 1:n
        r(i, j) = j;
    end
end
% Floyd算法开始
for k = 1:n
    for i = 1:n
        for j = 1:n
            if d(i, k)+d(k, j)<d(i, j)
                d(i, j) = d(i, k)+d(k, j);
                r(i, j) = r(i, k);
            end
        end
    end
end
end
function DisplayPath(route, start, dest)
%% 打印出任意两点之间的最短路径
% route : 路由表
% start : 起点index
% dest : 终点index
while 1
    if route(start, dest) ~= dest
        fprintf('V%s -> ', num2str(start));
        start = route(start, dest);
    else
        fprintf('V%s -> ', num2str(start));
        fprintf('V%s\n', num2str(dest));
        break;
    end
end
end

运行结果如下:

d =

     0     2     5     4
     9     0     3     4
     6     8     0     1
     5     7    10     0


r =

     1     2     2     4
     3     2     3     3
     4     4     3     4
     1     1     1     4

--------------------------
V1 -> V1
V1 -> V2
V1 -> V2 -> V3
V1 -> V4
V2 -> V3 -> V4 -> V1
V2 -> V2
V2 -> V3
V2 -> V3 -> V4
V3 -> V4 -> V1
V3 -> V4 -> V1 -> V2
V3 -> V3
V3 -> V4
V4 -> V1
V4 -> V1 -> V2
V4 -> V1 -> V2 -> V3
V4 -> V4

三、参考文献

[1] kabuto_hui. 最短路径-Floyd算法的matlab实现.md. CSDN博客.

你可能感兴趣的:(matlab,最优化问题,算法,matlab)