MATLAB程序——钢管下料问题(优化问题)
某钢管零售商从钢管厂进货,将钢管按照顾客的要求切割后售出,从钢管厂进货时得到的原料钢管都是19m。
(1)现在一客户需要50根4m,20根6m,15根8m的钢管。应如何下料最省?
【MATLAB程序——钢管下料问题(优化问题)】(2)零售商如果采用的不同切割模式太多,将会导致生产过程的复杂化,从而增加生产和管理成本,所以零售商规定采取的不同切割模式不能超过3种。此外,该客户除需要(1)中的三种钢管外,还需要10根5m的钢管。应如何下料最节省?
问题求解:
(1)建立模型之前,需要先考虑决策变量和目标函数。一根钢管有多种切割方式,难以直接从长度入手,但可以由长度的约束条件可以得到7种切割方式,并以切割方式的种类数量作为决策变量。至于目标函数,有两个,即①切割的原料钢管数最少;②余料最少。之后可建立模型,求解。
先优先考虑原料钢管数最少,再以最少的原料钢管数作为约束条件,求解余料最少的方案。
MATLAB代码:
clc
clear
G = zeros(1,4);
k1=0;
k2=0;
k3=0;
i = 1;
for k1 = 0:1:4
for k2 = 0:1:3
for k3 = 0:1:2
if (19-(4*k1+6*k2+8*k3)>=0) && (19-(4*k1+6*k2+8*k3)<=3)
G(i,1) = k1;
G(i,2)=k2;
G(i,3)=k3;
G(i,4) = 19-k1*4-k2*6-k3*8;
i=i+1;
end
end
end
endA = zeros(3,i-1);
for ii = 1:7
for jj = 1:3
A(jj,ii) = -G(ii,jj);
end
endb = [-50;
-20;
-15];
C = ones(1,7);
intcon = ones(1,7);
lb = zeros(1,7);
ub = [inf,inf,inf,inf,inf,inf,inf];
[x,fval] = intlinprog(C,intcon,A,b,[],[],lb,ub)for i=1:7
C(i) = G(i,4);
end
Aeq = ones(1,7);
beq = 25;
[x1,fval1] = intlinprog(C,intcon,A,b,Aeq,beq,lb,ub)
解得是用钢管25根,余料35m.
(2)对切割模式进行限制,我选择在ub上对x进行限制。(用Lingo会简单一点)
clc
clear
G = zeros(1,4);
k1=0;
k2=0;
k3=0,k4=0;
i = 1;
for k1 = 0:1:4
for k2 = 0:1:3
for k3 = 0:1:2
for k4 = 0:1:3
if (19-(4*k1+6*k2+8*k3+5*k4)>=0) && (19-(4*k1+6*k2+8*k3+5*k4)<=3)
G(i,1) = k1;
G(i,2)=k2;
G(i,3)=k3;
G(i,4)=k4;
G(i,5) = 19-k1*4-k2*6-k3*8-k4*5;
i=i+1;
end
end
end
end
endA = zeros(4,i-1);
for ii = 1:i-1
for jj = 1:4
A(jj,ii) = -G(ii,jj);
end
endb = [-50;
-20;
-15;
-10];
C = ones(1,i-1);
intcon = 1:i-1
lb = zeros(1,i-1);
ub = zeros(1,i-1);
minf = 1000;
x1 = zeros(i-1);
for X = 1:i-1-2
for Y = X+1:i-1-1
for Z = Y+1:i-1
ub(X)=inf;
ub(Y)=inf;
ub(Z)=inf;
[x,fval] = intlinprog(C,intcon,A,b,[],[],lb,ub);
if minf > fval
minf = fval;
x1 = x;
end
ub(X)=0;
ub(Y)=0;
ub(Z)=0;
end
end
end
minf%原料钢管数
x1for j=1:i-1
C(j) = G(j,5);
end
Aeq = ones(1,i-1);
beq = minf;
minf2 = 1000;
x2 = zeros(i-1);
for X = 1:i-1-2
for Y = X+1:i-1-1
for Z = Y+1:i-1
ub(X)=inf;
ub(Y)=inf;
ub(Z)=inf;
[x,fval2] = intlinprog(C,intcon,A,b,Aeq,beq,lb,ub);
if minf2 > fval2
minf2 = fval2;
x2 = x;
end
ub(X)=0;
ub(Y)=0;
ub(Z)=0;
end
end
end
minf2%余料
x2
输出结果原料钢管数为28根,余料34m.
推荐阅读
- 急于表达——往往欲速则不达
- 慢慢的美丽
- 《真与假的困惑》???|《真与假的困惑》??? ——致良知是一种伟大的力量
- 2019-02-13——今天谈梦想()
- 考研英语阅读终极解决方案——阅读理解如何巧拿高分
- Ⅴ爱阅读,亲子互动——打卡第178天
- 低头思故乡——只是因为睡不着
- 基于微信小程序带后端ssm接口小区物业管理平台设计
- 取名——兰
- 每日一话(49)——一位清华教授在朋友圈给大学生的9条建议