缺点:
1.代码解耦差 没有实现 文件分布 函数分离
2.命名不清晰
3.一节简单常用的操作没有函数化
4.注释不清晰
NodeData = xlsread('cumcm2011B.xls',1,'B2:C93');
RoutineData = xlsread('cumcm2011B.xls',2,'A2:B144');
caseIndex = xlsread('cumcm2011B.xls',1,'E1:E93');%各个节点的案件发生次数
[i,j] = find(RoutineData>92); %找出路口节点在A区外的路
RoutineData(i,:) = []; %删掉这些路
N = length(RoutineData);
U = zeros(92); %最小距离矩阵预分配
for i = 1:N
m = RoutineData(i,:); %取出每条路的起始点和终点
U(m(1),m(2)) = norm(NodeData(m(1),:)-NodeData(m(2),:)); %计算欧式距离
end
U = U + U';
U(~U)=Inf; %将0全部变为Inf
U(logical(eye(92))) = 0; %对角线变0,不能用U-diag(diag(U)),Inf-Inf = NaN;
%Floyd求最短路径,在U中
n = 92;
for k = 1:n
for i = 1:n
for j = 1:n
if U(i,j) > U(i,k) + U(k,j)
U(i,j) = U(i,k) + U(k,j);
end
end
end
end
P = U([1:20 28 39 48 87],:); %服务点到节点的最短距离
cover = sum(P<30); %<30代表小于3km,没有不能三分钟到达
%[row,col]=find(cover==0); % col 存储不能三分钟到达的有六个点
[x,y] = find(P == min(P)); %x为92*1的向量,代表了节点所属的服务点。
Assign = cell(1,24); %Assign 用来存储 分配的节点
for i = 1:24
Assign{1,i} = find(x==i);
end
%计算AB 类节点 MP为P的逻辑矩阵
LogP = (P<=30);
AB = cell(1,92); %AB为元组 用来存 每个节点对应的服务站
for i = 1:92
AB{1,i} = find(LogP(:,i)==1);
end
%NumAB 存每个节点的服务数
NumAB = ones(1,92);
for i = 1:92
NumAB(1,i) = size(AB{1,i},1);
end
%Acol存A类节点 其余为 B类 C为col存
[Arow,Acol] = find(NumAB==1);
%C存每个节点的工作量 AvgC =5.1875 合理的节点平均工作量 CVariance = C的方差
C = zeros(1,24);
CVariance = std2(C);
CVariance = CVariance*CVariance;
AvgC = sum(caseIndex)/24;
for j = 1:24
a = Assign{1,j};
for i = 1:length(a)
C(1,j) = C(1,j) +caseIndex(a(i,1),1);
end
end
ReAss = Assign;
ReAss{1,1}(find(ReAss{1,1} == 68),:) =[];
%Sur = 需要调整的B类点
Sur = [1:92];
Sur = setdiff(Sur,Acol);
Sur = setdiff(Sur,[1:20 28 39 48 87]);
AB{1,Sur(1,1)};
%第一个剩余点的第一个服务的工作量 ser1
C(1,AB{1,Sur(1,1)}(1,1));
%Ser = B类节点的服务
Ser = cell(1,50);
Ser{1,1} = AB{1,Sur(1,1)};
for i =1:50
Ser{1,i} = AB{1,Sur(1,i)};
end
%进行节点的分配 原来的删除
for j =1:50
len = length(Ser{1,j})
z =0;
for i =1 :len
%C需要更新
Cj = C(1,Ser{1,j}(i,1));
if (Cj <AvgC) &(z==0)
z=1;
Assign{1,Ser{1,j}(i,1)} = [Assign{1,Ser{1,j}(i,1)};Sur(1,j)]
%更新C
caseIndex = xlsread('cumcm2011B.xls',1,'E1:E93');%各个节点的案件发生次数
C = zeros(1,24);
for k = 1:24
a = Assign{1,k};
for i1 = 1:length(a)
C(1,k) = C(1,k) +caseIndex(a(i1,1),1);
end
end
%结束更新
if(z==1)
Assign{1,Ser{1,j}(1,1)}(Assign{1,Ser{1,j}(1,1)}==Sur(1,j)) = [];
%Assign{1,Ser{1,j}(1,1)}(find(Assign{1,Ser{1,j}(1,1)})==Sur(1,j)) = [];
%更新C
caseIndex = xlsread('cumcm2011B.xls',1,'E1:E93');%各个节点的案件发生次数
C = zeros(1,24);
for n = 1:24
a = Assign{1,n};
for i2 = 1:length(a)
C(1,n) = C(1,n) +caseIndex(a(i2,1),1);
end
end
%UPDATA over
end
end
end
end
a =0;
for i=1:24
a=a+ length(Assign{1,i})
end