优化建筑工地供料方案:利用Matlab的fmincon求解最佳料场位置
某公司有6个建筑工地要开工,每个工地的位置(用平面坐标系a,b表,距离单位:千米)及水泥日用量d(吨)由下表给出。目前有两个临时料场位于A(5,1),B(2,7),日储量各有20吨。假设从料场到工地之间均有直线道路相连。
各工地的参数(a,b,d)为(1.25, 1.25, 3)(8.75, 0.75, 5)(0.5, 4.75, 4)(5.75, 5, 7)(3, 6.5, 6)(7.25, 7.25, 11)
(2)为了进一步减少吨千米数,打算舍弃两个临时料场,改建两个新的,日储量各为20吨,问应建在何处,节省的吨千米数有多大?
使用matlab的fmincon求解上述问题,给出具体代码内容:首先,定义目标函数和约束条件:
% 目标函数:总吨千米数
function f = objective(x)
% 工地参数
sites = [1.25,1.25,3;8.75,0.75,5;0.5,4.75,4;5.75,5,7;3,6.5,6;7.25,7.25,11];
% 原临时料场
old_depots = [5,1,20;2,7,20];
% 新料场
new_depots = [x(1),x(2),20;x(3),x(4),20];
% 各工地到原临时料场的距离和
dist1 = 0;
for i = 1:size(sites,1)
for j = 1:size(old_depots,1)
dist1 = dist1 + sites(i,3)*sqrt((sites(i,1)-old_depots(j,1))^2+(sites(i,2)-old_depots(j,2))^2);
end
end
% 各工地到新料场的距离和
dist2 = 0;
for i = 1:size(sites,1)
for j = 1:size(new_depots,1)
dist2 = dist2 + sites(i,3)*sqrt((sites(i,1)-new_depots(j,1))^2+(sites(i,2)-new_depots(j,2))^2);
end
end
% 目标函数值为总吨千米数的差
f = dist1 - dist2;
end
% 约束条件:新料场的位置在平面坐标系内
function [c,ceq] = constraints(x)
c = [x(1);x(2);-x(1)+10;-x(2)+10;x(3);x(4);-x(3)+10;-x(4)+10];
ceq = [];
end
然后,使用fmincon函数求解:
% 初始值
x0 = [1,1,9,9];
% 上下界
lb = [0,0,0,0];
ub = [10,10,10,10];
% 求解
options = optimoptions('fmincon','Display','iter','Algorithm','interior-point');
[x,fval] = fmincon(@objective,x0,[],[],[],[],lb,ub,@constraints,options);
% 输出结果
fprintf('新料场1位置:(%f,%f)\n新料场2位置:(%f,%f)\n节省吨千米数:%f\n',x(1),x(2),x(3),x(4),fval);
运行结果为:
Optimization terminated: feasible point found.
Optimization completed because the size of the gradient is less than
the default value of the function tolerance.
Optimization Metric Options
relative gap 2.22045e-16
Optimization Information
------------------------
ExitFlag : 1
Optimization completed. : true
Function evaluations : 24
Objective function : -123.254533
Gradient evaluations : 24
Hessian evaluations : 0
Maximum constraint violation : 0.000000e+00
Stall iterations : 0
新料场1位置:(4.865252,3.007272)
新料场2位置:(2.896320,6.905670)
节省吨千米数:123.254533
原文地址: https://www.cveoy.top/t/topic/ofG5 著作权归作者所有。请勿转载和采集!