路口节点分配问题源码,此处的赋权邻接矩阵已知
以下是一个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);
运行结果:
分支界定求解结果
遗传算法求解结果