MATLAB:Floyd算法的解释

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
clc,clear                        %首先构造线路的距离矩阵 
LK=xlsread('datacumcm2011B.xls.',1);  
XL=xlsread('datacumcm2011B.xls.',2); 
XL=sort(XL,2);   %调整起点与终点的标号,小标号为起点,方便构造邻接矩阵   
                                %%%%%%%%%%%%按列的方向排序!!!!!!
                                     %把线路的起点和终点编号变为坐标 
                                     
D(:,[1,2])=LK(XL(:,1),[2,3]);  %矩阵D的第12列,为XL起点路口标号对应路口的坐标 
D(:,[3,4])=LK(XL(:,2),[2,3]);  %矩阵D的第34列,为XL终点路口标号对应路口的坐标 
dsd1=((D(:,1)-D(:,3)).^2+(D(:,2)-D(:,4)).^2).^(1/2);   %求每条线路的距离
%%%%%%%%%%%%%%%%%%%%%%5

dsd=zeros(582);     %路口的最大标号为582

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%一开始的矩阵dsd是个582*5820矩阵,下面进行替换dsd的部分元素:

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
for i=1:size(XL,1) 
    dsd(XL(i,1),XL(i,2))=dsd1(i);   %构造距离矩阵   
                                  %%%%!!!!XL的第一列作为矩阵dsd中的元素dsd(i,j)的i;
                                  %%%%%%%%%%  XL的第一列作为矩阵dsd中的元素dsd(i,j)的j;
end


%%%以上的!!!!!!!!!!!!!!!!!矩阵dsd是距离矩阵!!!!!!!!!!!!!!
%%%%%%%%%%%%%%%%%%%%%%%%%距离矩阵与其转置矩阵相加,再加上582*582(与dsd行尺寸相同)单位矩阵:
size(dsd,1)


%构造邻接矩阵 
A=dsd+dsd'+eye(size(dsd,1));     %对称矩阵,同时让对角线的元素为1   

%%%%%%%%%%%%%%%%%%为何加单位矩阵?
%%%%%%%%%%%答:因为要在A中find(寻找)(A==0)的元素,令等于0的元素替换为Inf(无穷)%%%%%%%%%%%%%% 而对角线的0元素不需要替换,因为当i=j时,起点i到终点j的距离为0

A(find(A==0))=Inf;     %把矩阵A的0Inf(无穷)替代 
A=A-eye(size(dsd,1));  %把矩阵A对角线的元素变为0 


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%弗洛伊德算法:
%%%%%%%%%%%%% [D1,path]=floyd(A)
%%%%%%%%%% A: 是带权邻接矩阵,在这里 权 的 具体意义 是 距离
%%%%%   D1:   最短路径(这里的路径指的是距离)矩阵,
%%%%%%%%%%%%%%%     其中的元素D1(i,j)的含义是:顶点i到顶点j的最短路径(距离)值,即权;
%%%%%%%%%%%%%%%%%%%%%%%% 矩阵D1记录了所有顶点之间的最短路径;
%%%  path:          该矩阵的元素 path(i,j) 记录的是 顶点i 到 顶点j 经过的顶点标号path(i,j)%%%%%%%%%% 我们应该注意到是,权的具体含义来自于开始时定义的距离矩阵,也就是说,权的具体含义由一开始算各顶点之间的“什么”决定
%%%%%%%%%%%%假如我们一开始构造了各顶点的时间矩阵T,那么[D1,path]=floyd算出来的
%%%%%%%%%%%%   D1是各顶点之间的最短时间(路径)矩阵
%%%%%%%%%%%    path是顶点i到顶点j的最短时间路径的经过哪个顶点

[D1,path]=floyd(A);

%%%%%%%%%%%%%%%步骤3:计算A区各路口与20交警平台最短距离,谁近归谁管
%%%%
for i=21:92 
    for j=1:20; 
        [L,R]=router(D1,path,j,i); 
        w(j)=max(L); 
    end
    n(i)=find(w==min(w)); 
end
for k=1:20 
    B{k}=[k,find(n==k)];  %分配给平台k管理的路口 
end
B{:}
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值