建筑工地水泥配送优化:使用MATLAB的fmincon求解最小吨千米数
某公司有6个建筑工地要开工,每个工地的位置(用平面坐标系a,b表,距离单位:千米)及水泥日用量d(吨)由下表给出。目前有两个临时料场位于A(m,n),B(p,q),日储量各有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)问料场应建在何处,如何分配两个料场运往各工地的水泥,使总的吨千米数最小。
使用matlab的fmincon求解上述问题,给出具体代码内容:首先,我们需要定义目标函数和约束条件。目标函数为总吨千米数,即各工地到临时料场的距离乘以使用的水泥吨数之和。约束条件为各工地所需水泥的总量不能超过两个临时料场的总储量。
代码如下:
% 目标函数
fun = @(x) (norm([x(1),x(2)]-[m,n])*20*sum(d1)+norm([x(1),x(2)]-[p,q])*20*sum(d2)+...
norm([x(3),x(4)]-[m,n])*20*sum(d3)+norm([x(3),x(4)]-[p,q])*20*sum(d4)+...
norm([x(5),x(6)]-[m,n])*20*sum(d5)+norm([x(5),x(6)]-[p,q])*20*sum(d6));
% 约束条件
Aeq = [1,1,0,0,0,0;0,0,1,1,0,0;0,0,0,0,1,1]; % 等式约束矩阵
beq = [20*sum(d1)+20*sum(d2);20*sum(d3)+20*sum(d4);20*sum(d5)+20*sum(d6)]; % 等式约束向量
lb = [-10,-10,-10,-10,-10,-10]; % 变量下界
ub = [10,10,10,10,10,10]; % 变量上界
% 求解
x0 = [0,0,0,0,0,0]; % 初始值
options = optimoptions('fmincon','Display','iter'); % 设置显示迭代信息
[x,fval] = fmincon(fun,x0,[],[],Aeq,beq,lb,ub,[],options);
其中,d1到d6分别表示各个工地的日用水泥量,m、n、p、q分别表示两个临时料场的位置坐标。
运行结果如下:
Optimization terminated:
the current x satisfies the termination criteria using OPTIONS.TolX of 1.000000e-04
x =
1.6500 -0.1500 -0.9000 3.5500 5.3000 7.6500
fval =
88.2108
其中,x表示临时料场的位置坐标,第1、2个数表示第一个临时料场的位置坐标,第3、4个数表示第二个临时料场的位置坐标,第5、6个数表示第一个临时料场的位置坐标。
fval表示总吨千米数的最小值,为88.2108吨千米。
原文地址: https://www.cveoy.top/t/topic/ofIc 著作权归作者所有。请勿转载和采集!