钢管下料模型

【问题引入】

生产过程中常会遇到通过切割、剪裁等手段将原材料加工成所需尺寸,这种工艺称为原料下料.按照进一步的工艺要求,确定下料方案使用原材料最少或利润最大,这是典型的优化问题.

【案例分析】

一、某钢管零售商从钢管厂进货,将钢管按照客户需求切割出售,从钢管厂进货时得到的原料钢管长度都是19m,大多数客户需求的钢管长度为4m、5m、6m.现一客户需要50根4m、10根5m、20根6m和15根8m的钢管,应如何下料最节省?为减少生产和管理成本,规定采用的不同切割模式不能超过3种.

*注:本题选自赵静,但琦.数学建模与数学实验(第5版)

  1. 基本假设

(1) 切割过程无损耗、无次品;

(2)切割余料不能再利用;

(3)每种切割模式余料长度小于最小需求长度4m;

(4)零售商现有4m、5m、6m、8m钢管数目为0;

(5) 生产过程中,4m、5m、6m钢管允许剩余,8m钢管不允许剩余.

  1. 符号说明

(1)下料问题的例子建模全步骤以及python 代码_数学建模表示按照第下料问题的例子建模全步骤以及python 代码_程序运行_02种切割模式切割的钢管数目;

(2)下料问题的例子建模全步骤以及python 代码_数学建模_03表示按照第下料问题的例子建模全步骤以及python 代码_程序运行_02种切割模式切割,每根原料钢管产生第下料问题的例子建模全步骤以及python 代码_数学建模_05种所需钢管的数目.

  1. 建立模型

寻求最优的切割模式,使得所用原料钢管数目最少

(1)目标函数 min 下料问题的例子建模全步骤以及python 代码_穷举法_06+下料问题的例子建模全步骤以及python 代码_数学建模_07+下料问题的例子建模全步骤以及python 代码_约束条件_08

(2)约束条件

a.客户需求限制:

切割的钢管数目须满足客户的需求.

下料问题的例子建模全步骤以及python 代码_穷举法_09

b.原料钢管长度限制:

原料钢管长度为19m,任一切割模式下,可利用的钢管长度不得超过19m.

下料问题的例子建模全步骤以及python 代码_穷举法_10

这里没有设置下限16,因为在较优的切割模式下,已默认满足基本假设(3).

c.最低钢管数目限制:

为减少计算量,缩小可行域,现考虑特殊情况.

假设所有钢管可无缝拼接,客户所需钢管总长度为

下料问题的例子建模全步骤以及python 代码_数学建模_11

因此,拼接

下料问题的例子建模全步骤以及python 代码_约束条件_12

根钢管即可满足客户需求.事实上,钢管不可拼接,因此,所用原料钢管数目不小于26根,此为原料钢管数目下限.即:

下料问题的例子建模全步骤以及python 代码_约束条件_13

d.非负整数限制

变量下料问题的例子建模全步骤以及python 代码_数学建模下料问题的例子建模全步骤以及python 代码_数学建模_03为非负整数.

由此构建模型如下:

下料问题的例子建模全步骤以及python 代码_穷举法_16

  1. 模型求解

该模型为非线性整数规划,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.符号说明

下料问题的例子建模全步骤以及python 代码_数学建模表示按照第种下料方案下料的圆钢数目.

3.建立模型

(1)目标函数

下料问题的例子建模全步骤以及python 代码_程序运行_18

(2)约束条件

a.单位需求限制

下料问题的例子建模全步骤以及python 代码_穷举法_19

b.非负整数限制

下料问题的例子建模全步骤以及python 代码_程序运行_20

由此构建模型如下:

下料问题的例子建模全步骤以及python 代码_数学建模_21

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中默认变量非负);

程序运行结果同上.

【模型总结】

模型一:设原料钢管长为下料问题的例子建模全步骤以及python 代码_程序运行_22,现需要下料问题的例子建模全步骤以及python 代码_穷举法_23根长为下料问题的例子建模全步骤以及python 代码_数学建模_24下料问题的例子建模全步骤以及python 代码_数学建模_25根长为下料问题的例子建模全步骤以及python 代码_数学建模_26,……,下料问题的例子建模全步骤以及python 代码_约束条件_27根长为下料问题的例子建模全步骤以及python 代码_穷举法_28的钢管.如何下料最节省?规定下料方案不超过下料问题的例子建模全步骤以及python 代码_穷举法_29种.

  1. 基本假设

(1)下料过程无损耗、无次品;

(2)余料不能再利用;

(3)每种下料方案余料长度小于最小需求长度;

(4)现有各种所需钢管数目为0.

  1. 符号说明

(1)下料问题的例子建模全步骤以及python 代码_数学建模表示按照第种下料方案产生的钢管数目;

(2)下料问题的例子建模全步骤以及python 代码_数学建模_03表示按照第种下料方案下料,每根原料钢管产生第种所需钢管的数目.

  1. 建立模型

寻求最优的下料方案,使得所用原料钢管数目最少

(1)目标函数

下料问题的例子建模全步骤以及python 代码_数学建模_32

(2)约束条件

a.需求限制

下料问题的例子建模全步骤以及python 代码_数学建模_33

b.原料钢管长度限制

下料问题的例子建模全步骤以及python 代码_穷举法_34

c.非负整数限制

变量下料问题的例子建模全步骤以及python 代码_数学建模下料问题的例子建模全步骤以及python 代码_数学建模_03为非负整数.

  1. 模型求解

由上述分析可得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

模型二:设原料钢管长为下料问题的例子建模全步骤以及python 代码_程序运行_22,现需要下料问题的例子建模全步骤以及python 代码_穷举法_23根长为下料问题的例子建模全步骤以及python 代码_数学建模_24下料问题的例子建模全步骤以及python 代码_数学建模_25根长为下料问题的例子建模全步骤以及python 代码_数学建模_26,……,下料问题的例子建模全步骤以及python 代码_约束条件_27根长为下料问题的例子建模全步骤以及python 代码_穷举法_28的钢管.如何下料最节省?

假设用穷举法列举所有可能的下料方案共下料问题的例子建模全步骤以及python 代码_数学建模_44种,令下料问题的例子建模全步骤以及python 代码_数学建模_45,可用模型一求解.

也可用下面的方法进行求解.

1、基本假设

(1)下料过程无损耗、无次品;

(2)余料不能再利用;

(3)每种下料方案余料长度小于最小需求长度;

(4)现有各种所需钢管数目为0.

  1. 符号说明
    (1)下料问题的例子建模全步骤以及python 代码_数学建模_46表示按照第种下料方案产生的钢管数目;
    (2)下料问题的例子建模全步骤以及python 代码_穷举法_47为穷举法列表矩阵,其中,下料问题的例子建模全步骤以及python 代码_程序运行_48表示按照第下料问题的例子建模全步骤以及python 代码_约束条件_49种下料方案下料,每根原料钢管产生第下料问题的例子建模全步骤以及python 代码_数学建模_50种所需钢管的数目.
  2. 建立模型

(1)目标函数

下料问题的例子建模全步骤以及python 代码_约束条件_51

(2)约束条件

a.需求限制

下料问题的例子建模全步骤以及python 代码_约束条件_52

b.非负整数限制

变量为非负整数.

  1. 模型求解

由上述分析可得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中默认变量非负);