MATLAB代码之耻辱

缺点:
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

猜你喜欢

转载自blog.csdn.net/qq_42676042/article/details/106980326