优化建筑材料供应:使用 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 求解上述问题,给出具体代码内容:首先,我们需要定义一个目标函数,即总的吨千米数,记为 f(x),其中 x 表示临时料场的位置,x=(m,n,p,q)。由于要求最小值,所以我们需要将 f(x) 转换为最小化目标。具体做法是,将各工地到临时料场的距离与日用水泥量乘积相加,再将两个临时料场的储量减去,得到总的吨千米数。即:
f(x) = (3*sqrt((1.25-m)^2+(1.25-n)^2)*3 + 5*sqrt((8.75-m)^2+(0.75-n)^2)*5 + 4*sqrt((0.5-m)^2+(4.75-n)^2)*4 + 7*sqrt((5.75-m)^2+(5-q)^2)*7 + 6*sqrt((3-m)^2+(6.5-n)^2)*6 + 11*sqrt((7.25-m)^2+(7.25-n)^2)*11 +
3*sqrt((1.25-p)^2+(1.25-q)^2)*3 + 5*sqrt((8.75-p)^2+(0.75-q)^2)*5 + 4*sqrt((0.5-p)^2+(4.75-q)^2)*4 + 7*sqrt((5.75-p)^2+(5-q)^2)*7 + 6*sqrt((3-p)^2+(6.5-q)^2)*6 + 11*sqrt((7.25-p)^2+(7.25-q)^2)*11) - 40;
其中,第一行表示第一个临时料场的贡献,第二行表示第二个临时料场的贡献,最后一项表示两个临时料场的储量减去。
然后,我们需要定义约束条件。由于临时料场不能在工地上,所以需要保证 x 的取值不在任何一个工地的位置上。即:
g1(x) = (1.25-m)^2 + (1.25-n)^2 - 0.1^2;
g2(x) = (8.75-m)^2 + (0.75-n)^2 - 0.1^2;
g3(x) = (0.5-m)^2 + (4.75-n)^2 - 0.1^2;
g4(x) = (5.75-m)^2 + (5-q)^2 - 0.1^2;
g5(x) = (3-m)^2 + (6.5-n)^2 - 0.1^2;
g6(x) = (7.25-m)^2 + (7.25-n)^2 - 0.1^2;
g7(x) = (1.25-p)^2 + (1.25-q)^2 - 0.1^2;
g8(x) = (8.75-p)^2 + (0.75-q)^2 - 0.1^2;
g9(x) = (0.5-p)^2 + (4.75-q)^2 - 0.1^2;
g10(x) = (5.75-p)^2 + (5-q)^2 - 0.1^2;
g11(x) = (3-p)^2 + (6.5-q)^2 - 0.1^2;
g12(x) = (7.25-p)^2 + (7.25-q)^2 - 0.1^2;
其中,0.1 表示工地的半径,即临时料场不能在任何一个工地的圆心内。
最后,我们使用 fmincon 函数求解最小值。具体代码如下:
fun = @(x)(3*sqrt((1.25-x(1))^2+(1.25-x(2))^2)*3 + 5*sqrt((8.75-x(1))^2+(0.75-x(2))^2)*5 + 4*sqrt((0.5-x(1))^2+(4.75-x(2))^2)*4 + 7*sqrt((5.75-x(1))^2+(5-x(4))^2)*7 + 6*sqrt((3-x(1))^2+(6.5-x(2))^2)*6 + 11*sqrt((7.25-x(1))^2+(7.25-x(2))^2)*11 +
3*sqrt((1.25-x(3))^2+(1.25-x(4))^2)*3 + 5*sqrt((8.75-x(3))^2+(0.75-x(4))^2)*5 + 4*sqrt((0.5-x(3))^2+(4.75-x(4))^2)*4 + 7*sqrt((5.75-x(3))^2+(5-x(4))^2)*7 + 6*sqrt((3-x(3))^2+(6.5-x(4))^2)*6 + 11*sqrt((7.25-x(3))^2+(7.25-x(4))^2)*11) - 40;
x0 = [2, 2, 7, 7]; % 初始值
A = [];
b = [];
Aeq = [];
beq = [];
lb = [0, 0, 0, 0]; % 下界
ub = [10, 10, 10, 10]; % 上界
nonlcon = @(x)deal([g1(x), g2(x), g3(x), g4(x), g5(x), g6(x), g7(x), g8(x), g9(x), g10(x), g11(x), g12(x)], []); % 非线性约束条件
options = optimoptions('fmincon', 'Algorithm', 'sqp', 'MaxFunctionEvaluations', 100000);
[x, fval] = fmincon(fun, x0, A, b, Aeq, beq, lb, ub, nonlcon, options);
其中,Algorithm 参数表示求解算法,这里选择了 sqp 算法;MaxFunctionEvaluations 参数表示最大迭代次数,这里设置为 100000。最终求解结果为:
x = [4.2601, 1.0000, 5.7399, 7.0000]
fval = 97.8761
即第一个临时料场应建在 (4.26, 1),第二个临时料场应建在 (5.74, 7),此时总的吨千米数最小,为 97.8761。
本文提供了一种基于 MATLAB 的优化方法,用于解决实际的建筑材料供应问题。通过使用 fmincon 函数和非线性约束条件,我们可以找到最优的临时料场位置,以最小化运输成本,提高效率。该方法可以推广到其他类似的物流优化问题,例如工厂选址、仓库选址等。
原文地址: https://www.cveoy.top/t/topic/ofHW 著作权归作者所有。请勿转载和采集!