数学建模--Floyd算法

Floyd算法的核心思想是通过迭代的方式比较当前点u到下一个点v的路径l1与当前点u经过其他所有点中的一点作为中转点再到达下一个点v的路径l2,如果如果l1>l2,这将l2作为v点的最短路径。
具体的matlab实现代码如下:

function [P u] = Floyd_path(W, k1, k2)
%W表示权值矩阵
%k1表示起点
%k2表示终点
%P表示最短路
%u表示最短路的权和

%以下代码是求出所有的两点之间的最短路径长
%利用三层迭代
%第一层迭代是遍历所有点作为中转点
%第二层迭代是遍历所有点作为起点
%第三层迭代是遍历所有点作为终点
%通过第一层的迭代不断修改中转点最优化结果
%可能有些人会误解,通过用两个点作为中转点不是可能会更短吗
%其实代码已经一个点、两个点、三个点...作为中转的可能了
%在三次迭代中,会有m次是以同两个点作为始点和终点
%假设固定起点为1,终点为5,第一次是比较1-5与1-2-5的距离,
%如果1-2-5的距离小于1-5,则用1-2-5的距离代替1-5的距离,
%那么在下一次比较1-5与1-3-5的距离时,实际上是比较1-2-5与1-2-3-5的距离
%如果1-2-5的距离不小于1-5,则不变,在下次则比较1-5与1-3-5,不需要考虑中转点2
%因为中转点2并没有起到缩短1-5之间的最短距离
%在下一轮迭代也类似
n = length(W);
U = W;
m = 1;
while m <= n
    for i = 1: n
        for j = 1: n
            if U(i, j) > U(i, m) + U(m, j)
                U(i, j) = U(i, m) + U(m, j);
            end
        end
    end
    m = m + 1;
end
u = U(k1, k2);%u为k1,k2之间的最短路径

%下面的代码是接触最短路径的轨迹
%利用的思想等同于两点之间有且仅有一条直线
P1 = zeros(1: n);
k = 1;
P1(k) = k2;
V = ones(1, n) * inf;
kk = n;
while kk ~= k1
    for i = 1: n
        V(1, i) = U(k1, kk) - W(i, kk);
        if V(1, i) == U(k1, i)
            P1(k+1) = i;
            kk = i;
            k = k + 1;
        end
    end
end
k = 1;
%剔除P1等于0的点,为0说明最短路径没有经过该点
wrow = find(P1 ~= 0);
for j = length(wrow): (-1): 1
    P(k) = P1(wrow(j));
    k = k+1;
end
P;

代码是从书上抄下来的,注释是根据我自己的理解写下来的,如果有不足之处,希望指正,如涉及产权问题,请指出。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_relax

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值