钢管下料模型
【问题引入】
生产过程中常会遇到通过切割、剪裁等手段将原材料加工成所需尺寸,这种工艺称为原料下料.按照进一步的工艺要求,确定下料方案使用原材料最少或利润最大,这是典型的优化问题.
【案例分析】
一、某钢管零售商从钢管厂进货,将钢管按照客户需求切割出售,从钢管厂进货时得到的原料钢管长度都是19m,大多数客户需求的钢管长度为4m、5m、6m.现一客户需要50根4m、10根5m、20根6m和15根8m的钢管,应如何下料最节省?为减少生产和管理成本,规定采用的不同切割模式不能超过3种.
*注:本题选自赵静,但琦.数学建模与数学实验(第5版)
- 基本假设
(1) 切割过程无损耗、无次品;
(2)切割余料不能再利用;
(3)每种切割模式余料长度小于最小需求长度4m;
(4)零售商现有4m、5m、6m、8m钢管数目为0;
(5) 生产过程中,4m、5m、6m钢管允许剩余,8m钢管不允许剩余.
- 符号说明
(1)表示按照第种切割模式切割的钢管数目;
(2)表示按照第种切割模式切割,每根原料钢管产生第种所需钢管的数目.
- 建立模型
寻求最优的切割模式,使得所用原料钢管数目最少
(1)目标函数 min ++
(2)约束条件
a.客户需求限制:
切割的钢管数目须满足客户的需求.
b.原料钢管长度限制:
原料钢管长度为19m,任一切割模式下,可利用的钢管长度不得超过19m.
这里没有设置下限16,因为在较优的切割模式下,已默认满足基本假设(3).
c.最低钢管数目限制:
为减少计算量,缩小可行域,现考虑特殊情况.
假设所有钢管可无缝拼接,客户所需钢管总长度为
因此,拼接
根钢管即可满足客户需求.事实上,钢管不可拼接,因此,所用原料钢管数目不小于26根,此为原料钢管数目下限.即:
d.非负整数限制
变量和为非负整数.
由此构建模型如下:
- 模型求解
该模型为非线性整数规划,MATLAB无法直接求解,以下采用Lingo软件包求解.
可直接根据上述目标函数和约束条件建立模型求解.Lingo程序如下:
model:
title 钢管下料模型一;
min=x1+x2+x3;
r11*x1+r21*x2+r31*x3>=50;
r12*x1+r22*x2+r32*x3>=10;
r13*x1+r23*x2+r33*x3>=20;
r14*x1+r24*x2+r34*x3=15;
4*r11+5*r12+6*r13+8*r14<=19;
4*r21+5*r22+6*r23+8*r24<=19;
4*r31+5*r32+6*r33+8*r34<=19;
x1+x2+x3>=26;
@gin(x1);@gin(x2);@gin(x3);
@gin(r11);@gin(r12);@gin(r13);@gin(r14);
@gin(r21);@gin(r22);@gin(r23);@gin(r24);
@gin(r31);@gin(r32);@gin(r33);@gin(r34);
end
程序运行结果如下:
4m钢管 | 5m钢管 | 6m钢管 | 8m钢管 | |
0 | 1 | 1 | 1 | 15根 |
3 | 0 | 1 | 0 | 6根 |
4 | 0 | 0 | 0 | 8根 |
结果表明:所用原料钢管最少为29根.采用3种切割模式切割钢管.第1种模式切割15根钢管,每根钢管切割4m、5m、6m钢管各一根;第2种模式切割6根钢管,每根钢管分别切割4m、6m钢管3根、1根;第3种模式切割8根钢管,每根钢管切割4根4m钢管.
注:所用原料钢管最少为29根,但切割模式不唯一.
也可采用下面的程序:
model:
title 钢管下料模型二;
!建立集合;
sets:
num/1..3/:x;!3种切割模式切割钢管数目;
con/1..4/:a,b;!客户需要钢管长度和不等式约束条件中右侧常量;
links(num,con):r;!不同切割模式切割1根钢管产生不同种类的钢管数目;
endsets
!数据输入;
data:
a=4 5 6 8;!客户需要钢管长度;
b=50 10 20 15;!不等式约束条件中右侧常量;
enddata
min=@sum(num(i):x(i));!目标函数;
!4m、5m、6m钢管客户需求限制;
@for(con(j)|j#le#3:@sum(num(i):r(i,j)*x(i))>=b(j));
!8m钢管客户需求限制;
r(1,4)*x(1)+r(2,4)*x(2)+r(3,4)*x(3)=15;
!原料钢管长度限制;
@for(num(i):@sum(con(j):a(j)*r(i,j))<=19);
!整数限制(Lingo中默认变量非负);
@for(num(i):@gin(x(i)));
@for(links(i,j):@gin(r(i,j)));
end
程序运行结果同上.
二、某单位需加工制作100套钢架,每套需用长度为1m、2.1m、2.9m的圆钢各一根.
已知原料长6.9m.如何下料,使用的原料最省?
*注:本题选自司守奎,孙玺菁.数学建模算法与应用(第3版)
本题没有限制下料方式,可用穷举法列举所有可能的下料方案.在列举时,应当注意到,较优的下料方案余料小于1m.采用“由长到短,由无到有”的原则列举.
第1种 | 第2种 | 第3种 | 第4种 | 第5种 | 第6种 | 第7种 | |
2.9m | 0 | 0 | 0 | 0 | 1 | 1 | 2 |
2.1m | 0 | 1 | 2 | 3 | 0 | 1 | 0 |
1m | 6 | 4 | 2 | 0 | 4 | 1 | 1 |
合计 | 6 | 6.1 | 6.2 | 6.3 | 6.9 | 6 | 6.8 |
余料 | 0.9 | 0.8 | 0.7 | 0.6 | 0 | 0.9 | 0.1 |
1.基本假设
(1)下料过程无损耗、无次品;
(2)余料不能再利用;
(3) 每种下料方案余料长度小于最小需求长度1m;
(4)单位现有1m、2.1m、2.9m圆钢数目为0.
2.符号说明
表示按照第种下料方案下料的圆钢数目.
3.建立模型
(1)目标函数
(2)约束条件
a.单位需求限制
b.非负整数限制
由此构建模型如下:
4.模型求解
可直接根据上述目标函数和约束条件建立模型求解.Lingo程序如下:
model:
title 钢管下料模型二;
min=x1+x2+x3+x4+x5+x6+x7;
x5+x6+2*x7=100;
x2+2*x3+3*x4+x6=100;
6*x1+4*x2+2*x3+4*x5+x6+x7=100;
@gin(x1);@gin(x2);@gin(x3);@gin(x4);@gin(x5);@gin(x6);@gin(x7);
程序运行结果如下:
第1种 | 第2种 | 第3种 | 第4种 | 第5种 | 第6种 | 第7种 | 合计 |
1根 | 0根 | 0根 | 32根 | 12根 | 4根 | 42根 | 91根 |
注:所用圆钢最少为91根,但下料方案不唯一.
也可采用下面的程序:
model:
title 钢管下料模型二;
!建立集合;
sets:
num/1..7/:x; !不同下料方案所用圆钢数目;
con/1..3/:b; !不等式约束条件中右侧常量;
links(con,num):r; !不同下料方案套裁1根圆钢产生不同种类的圆钢数目;
endsets
!数据输入;
data:
b=100 100 100;
r=0 0 0 0 1 1 2 0 1 2 3 0 1 0 6 4 2 0 4 1 1; !穷举法列表矩阵;
enddata
min=@sum(num(i):x(i)); !目标函数;
@for(con(i):@sum(num(j):r(i,j)*x(j))=b(i)); !单位需求限制;
@for(num(i):@gin(x(i))); !整数限制(Lingo中默认变量非负);
程序运行结果同上.
【模型总结】
模型一:设原料钢管长为,现需要根长为,根长为,……,根长为的钢管.如何下料最节省?规定下料方案不超过种.
- 基本假设
(1)下料过程无损耗、无次品;
(2)余料不能再利用;
(3)每种下料方案余料长度小于最小需求长度;
(4)现有各种所需钢管数目为0.
- 符号说明
(1)表示按照第种下料方案产生的钢管数目;
(2)表示按照第种下料方案下料,每根原料钢管产生第种所需钢管的数目.
- 建立模型
寻求最优的下料方案,使得所用原料钢管数目最少
(1)目标函数
(2)约束条件
a.需求限制
b.原料钢管长度限制
c.非负整数限制
变量和为非负整数.
- 模型求解
由上述分析可得Lingo程序如下:
model:
title 钢管下料模型一;
sets:
num/1..t/:x;!t种下料方案所用钢管数目;
con/1..m/:a,b;!需求钢管长度和不等式(或等式)约束条件中右侧常量;
links(num,con):r;!不同下料方案下料1根钢管产生不同种类的钢管数目;
endsets
data:
a=a1 a2 …… am;!客户需要钢管长度;
b=n1 n2 …… nm;!不等式约束条件中右侧常量;
enddata
min=@sum(num(i):x(i));!目标函数;
!需求限制;
@for(con(j):@sum(num(i):r(i,j)*x(i))>=(=)b(j));
!原料钢管长度限制;
@for(num(i):@sum(con(j):a(j)*r(i,j))<=l0);
!整数限制(Lingo中默认变量非负);
@for(num(i):@gin(x(i)));
@for(links(i,j):@gin(r(i,j)));
end
模型二:设原料钢管长为,现需要根长为,根长为,……,根长为的钢管.如何下料最节省?
假设用穷举法列举所有可能的下料方案共种,令,可用模型一求解.
也可用下面的方法进行求解.
1、基本假设
(1)下料过程无损耗、无次品;
(2)余料不能再利用;
(3)每种下料方案余料长度小于最小需求长度;
(4)现有各种所需钢管数目为0.
- 符号说明
(1)表示按照第种下料方案产生的钢管数目;
(2)为穷举法列表矩阵,其中,表示按照第种下料方案下料,每根原料钢管产生第种所需钢管的数目. - 建立模型
(1)目标函数
(2)约束条件
a.需求限制
b.非负整数限制
变量为非负整数.
- 模型求解
由上述分析可得Lingo程序如下:
model:
title 钢管下料模型二;
sets:
num/1..t/:x;!t种下料方案所用钢管数目;
con/1..m/:b;!需求钢管长度和不等式(或等式)约束条件中右侧常量;
links(num,con):r;!不同下料方案下料1根钢管产生不同种类的钢管数目;
endsets
data:
b=n1 n2 …… nm;!不等式约束条件中右侧常量;
r=r11 r12 …… r1m r21 r22 …… r2m rt1 rt2 …… rtm; !穷举法列表矩阵;
enddata
min=@sum(num(i):x(i)); !目标函数;
@for(con(i):@sum(num(j):r(i,j)*x(j))>=(=)b(i)); !单位需求限制;
@for(num(i):@gin(x(i))); !整数限制(Lingo中默认变量非负);