%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
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的第1,2列,为XL起点路口标号对应路口的坐标
D(:,[3,4])=LK(XL(:,2),[2,3]); %矩阵D的第3,4列,为XL终点路口标号对应路口的坐标
dsd1=((D(:,1)-D(:,3)).^2+(D(:,2)-D(:,4)).^2).^(1/2); %求每条线路的距离
%%%%%%%%%%%%%%%%%%%%%%5
dsd=zeros(582); %路口的最大标号为582
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%一开始的矩阵dsd是个582*582的0矩阵,下面进行替换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的0用Inf(无穷)替代
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{:}
MATLAB:Floyd算法的解释
最新推荐文章于 2023-06-27 14:45:43 发布