算法设计大作业之交巡警服务平台的设置与调度

路口节点分配问题源码,此处的赋权邻接矩阵已知

以下是一个matlab代码,利用弗洛伊德算法求解,并用迪杰斯特拉算法检验

n=size( Adjacency_matrix,1);% Adjacency_matrix——赋权邻接矩阵
D= Adjacency_matrix;%距离矩阵
R = zeros(n,n);%最短路径矩阵

%初始化
for i=1:n
   for j=1:n
       if D(i,j)~=inf 
        R(i,j)=j;
       end
   end
end
%Floyd算法
%三重循环迭代最短路径
for k=1:n
   for i=1:n
      for j=1:n
         if D(i,k)+D(k,j)<D(i,j)
            D(i,j)=D(i,k)+D(k,j);
            R(i,j)=R(i,k);
         end
      end
   end
end 

Data=D(1:20,1:92);%A区有20个交巡警平台,92个路口节点
 xlswrite("A区各交巡警平台和最近各路口节点的距离.xlsx",Data); 

result_1=zeros(92,4);
 for j=1:92
    a=min(Data(:,j));%%各个路口节点距离最近的交巡警平台编号
    for i=1:20
        if Data(i,j)==a
            result_1(j,1)=j; %A区中的节点
            result_1(j,2)=i; %归属的平台
            result_1(j,3)=a; %点到归属平台的距离
            if a>3000%不超过3分钟,转化为距离
                 result_1(j,4)=1; %记录是否超时, 超时间记为1,否则为0
            else
                result_1(j,4)=0;
            end
        end
    end
 end

%结果存储
xlswrite("A区平台分配管辖结果.xlsx",result_1);

%% Dijkstra算法
n = size(Adjacency_matrix, 1); % 如果不是方阵,1是行,2是列
D = Adjacency_matrix; % 距离矩阵
R = zeros(n,n); % 最短路径矩阵

% 初始化路径矩阵R 
for i=1:n
   for j=1:n
       if D(i,j)~=inf
        R(i,j)=j;
       end
   end
end

% 遍历每个节点作为起点
for k=1:n
    S = zeros(1,n); % 记录确定最短路径的节点
    S(k) = 1; % 将起点加入S集合
    for i=1:n
        if i~=k
            D(i,k) = Adjacency_matrix(i,k);
        end
    end
    
    for i=1:n-1
        temp = inf;
        u = k;
        % 选择当前最短路径的节点
        for j=1:n
            if S(j)~=1 && D(j,k)<temp
                u = j;
                temp = D(j,k);
            end
        end
        S(u) = 1; % 将u加入S集合
        
        % 更新最短路径
        for j=1:n
            if S(j)~=1 && D(u,k)+Adjacency_matrix(u,j)<D(j,k)
                D(j,k) = D(u,k) + Adjacency_matrix(u,j);
                R(j,k) = R(u,k);
            end
        end
    end
end 


Data_4=D(1:20,1:92); % A区有20个交巡警平台,92个路口节点
xlswrite("dijkstraA区各交巡警平台和最近各路口节点的距离.xlsx",Data_4); 

result_1=zeros(92,4);
for j=1:92
    a=min(Data_4(:,j)); 
    for i=1:20
        if Data_4(i,j)==a
            result_1(j,1)=j; 
            result_1(j,2)=i; 
            result_1(j,3)=a; 
            if a>3000 
                result_1(j,4)=1; 
            else
                result_1(j,4)=0;
            end
        end
    end
end

xlswrite("dijkstraA区平台分配管辖结果.xlsx",result_1);
xlswrite("dijkstra全市各个节点点间的最短路径.xlsx",D); % 这个是为了后面有用存储的

弗洛伊德求解结果

迪杰斯特拉求解结果:

  

指派问题代码-序贯式优化

%% problem1-2(指派问题)
clear,clc 
temp=xlsread('A区各交巡警平台和最近各路口节点的距离','c2:c14'); 
ck=temp';

ck = [12 14 16 21 22 23 24 28 29 30 38 48 62]%出入A区的路口编号

D=xlsread('A区各交巡警平台和最近各路口节点的距离','A1:CN20');
% 用d存储A 区 20个交巡警平台到达13个出入口的最短距离
for i=1:20
    for j=1:13
        d(i,j)=D(i,ck(j));
    end
end


%优化第一层-最迟封锁的时间最小转化为最大距离最小

prob = optimproblem; 
x = optimvar('x',20,13,'Type','integer','LowerBound',0,'UpperBound',1); 
y = optimvar('y',1,1,'LowerBound',0); %转化变量
prob.Objective = y;  
prob.Constraints.con1 = sum(x,1)==1; %一个路口只要一个平台
prob.Constraints.con2 = sum(x,2)<=1; % 一个平台只能封锁一个路口 
con3=[]; %初始空约束,方便后面向里面添加约束
for i=1:20
    for j=1:13
   con3=[con3;d(i,j)*x(i,j)<=y];
    prob.Constraints.con3 = con3;
    end
end            %这个就是max的转化
 [sol, fval, flag] = solve(prob), sol.x; %sol封锁安排,fval目标值
disp(['最迟封锁的时间为' num2str(fval*1e-3) '分钟']); %计算封锁时间
disp(['此时总距离是' num2str(sum(sum(d.*sol.x))*1e-3) '公里']);%计算总距离
xlswrite("最迟封锁的时间最小的安排.xlsx",sol.x);f1=fval;%保存


%%
%优化问题第二层,在保证最迟封锁的时间最小的前提下,让总距离最小
prob = optimproblem;
x = optimvar('x',20,13,'Type','integer','LowerBound',0,'UpperBound',1);
prob.Objective =sum(sum(d.*x));  %总距离最小
prob.Constraints.con1 = sum(x,1)==1;
prob.Constraints.con2 = sum(x,2)<=1;
con3=[];
for i=1:20
    for j=1:13
con3=[con3;d(i,j)*x(i,j)<= f1+1e-3]; %增加干扰项放松限制,将第一次优化得到得f1用在第二次优化上
prob.Constraints.con3 = con3;
    end
end
Options = optimoptions("ga","UseParallel",true,"MutationFcn",...
    "mutationgaussian","PlotFcn",["gaplotmaxconstr","gaplotbestf"]);%遗传算法各参数
[sol,fval] = solve(prob,"Solver","ga","Options",Options),sol.x;%调用遗传算法
disp(['在保证封锁的时间最好的情况下,总距离是' num2str(fval*1e-3) '公里']); %1e-3就是除1000的意思
xlswrite("在保证封锁的时间最好的情况下,总距离最小的安排.xlsx",sol.x);

运行结果:

分支界定求解结果

遗传算法求解结果

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值