数学建模--Floyd算法

来源:互联网 发布:360便签软件 编辑:程序博客网 时间:2024/05/20 03:44

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;endu = 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    endendk = 1;%剔除P1等于0的点,为0说明最短路径没有经过该点wrow = find(P1 ~= 0);for j = length(wrow): (-1): 1    P(k) = P1(wrow(j));    k = k+1;endP;

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

原创粉丝点击