某公司有6个建筑工地要开工每个工地的位置用平面坐标系ab表距离单位:千米 及水泥日用量d吨由下表给出。目前有两个临时料场位于AmnBpq日储量各有20吨。假设从料场到工地之间均有直线道路相连。各工地的参数abd为12512538750755054754575573656725725112问料场应建在何处使总的吨千米数最小。使用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 + 5sqrt((8.75-m)^2+(0.75-n)^2)5 + 4sqrt((0.5-m)^2+(4.75-n)^2)4 + 7sqrt((5.75-m)^2+(5-q)^2)7 + 6sqrt((3-m)^2+(6.5-n)^2)6 + 11sqrt((7.25-m)^2+(7.25-n)^2)11 + 3sqrt((1.25-p)^2+(1.25-q)^2)3 + 5sqrt((8.75-p)^2+(0.75-q)^2)5 + 4sqrt((0.5-p)^2+(4.75-q)^2)4 + 7sqrt((5.75-p)^2+(5-q)^2)7 + 6sqrt((3-p)^2+(6.5-q)^2)6 + 11sqrt((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 + 5sqrt((8.75-x(1))^2+(0.75-x(2))^2)5 + 4sqrt((0.5-x(1))^2+(4.75-x(2))^2)4 + 7sqrt((5.75-x(1))^2+(5-x(4))^2)7 + 6sqrt((3-x(1))^2+(6.5-x(2))^2)6 + 11sqrt((7.25-x(1))^2+(7.25-x(2))^2)11 + 3sqrt((1.25-x(3))^2+(1.25-x(4))^2)3 + 5sqrt((8.75-x(3))^2+(0.75-x(4))^2)5 + 4sqrt((0.5-x(3))^2+(4.75-x(4))^2)4 + 7sqrt((5.75-x(3))^2+(5-x(4))^2)7 + 6sqrt((3-x(3))^2+(6.5-x(4))^2)6 + 11sqrt((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
原文地址: https://www.cveoy.top/t/topic/fq8e 著作权归作者所有。请勿转载和采集!