钢管下料模型

钢管下料模型

【问题引入】

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

【案例分析】

一、某钢管零售商从钢管厂进货,将钢管按照客户需求切割出售,从钢管厂进货时得到的原料钢管长度都是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) x i x_i xi表示按照第 i i i种切割模式切割的钢管数目;

(2) r i j r_{ij} rij表示按照第 i i i种切割模式切割,每根原料钢管产生第 j j j种所需钢管的数目.

  1. 建立模型

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

(1)目标函数 min x 1 x_1 x1+ x 2 x_2 x2+ x 3 x_3 x3

(2)约束条件

a.客户需求限制:

切割的钢管数目须满足客户的需求.在这里插入图片描述

b.原料钢管长度限制:

原料钢管长度为19m,任一切割模式下,可利用的钢管长度不得超过19m.
在这里插入图片描述

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

c.最低钢管数目限制:

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

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

在这里插入图片描述

因此,拼接在这里插入图片描述

根钢管即可满足客户需求.事实上,钢管不可拼接,因此,所用原料钢管数目不小于26根,此为原料钢管数目下限.即:
在这里插入图片描述

d.非负整数限制

变量 x i x_i xi r i j r_{ij} rij为非负整数.

由此构建模型如下:
在这里插入图片描述

  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钢管
011115根
30106根
40008根

结果表明:所用原料钢管最少为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.9m0000112
2.1m0123010
1m6420411
合计66.16.26.36.966.8
余料0.90.80.70.600.90.1

1.基本假设

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

(2)余料不能再利用;

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

(4)单位现有1m、2.1m、2.9m圆钢数目为0.

2.符号说明

x i x_i xi表示按照第种下料方案下料的圆钢数目.

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

程序运行结果同上.

【模型总结】

模型一:设原料钢管长为 l 0 l_0 l0,现需要 n 1 n_1 n1根长为 a 1 a_1 a1 n 2 n_2 n2根长为 a 2 a_2 a2,……, n m n_m nm根长为 a m a_m am的钢管.如何下料最节省?规定下料方案不超过 t t t种.

  1. 基本假设

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

(2)余料不能再利用;

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

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

  1. 符号说明

(1) x i x_i xi表示按照第种下料方案产生的钢管数目;

(2) r i j r_{ij} rij表示按照第种下料方案下料,每根原料钢管产生第种所需钢管的数目.

  1. 建立模型

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

(1)目标函数
在这里插入图片描述

(2)约束条件

a.需求限制
在这里插入图片描述

b.原料钢管长度限制
在这里插入图片描述

c.非负整数限制

变量 x i x_i xi r i j r_{ij} rij为非负整数.

  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

模型二:设原料钢管长为 l 0 l_0 l0,现需要 n 1 n_1 n1根长为 a 1 a_1 a1 n 2 n_2 n2根长为 a 2 a_2 a2,……, n m n_m nm根长为 a m a_m am的钢管.如何下料最节省?

假设用穷举法列举所有可能的下料方案共 s s s种,令 s = t s=t s=t,可用模型一求解.

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

1、基本假设

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

(2)余料不能再利用;

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

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

  1. 符号说明

    (1) x i x_i xi表示按照第种下料方案产生的钢管数目;

    (2) r r r为穷举法列表矩阵,其中, r i j r_{ij} rij表示按照第 i i i种下料方案下料,每根原料钢管产生第 j j j种所需钢管的数目.

  2. 建立模型

(1)目标函数
在这里插入图片描述

(2)约束条件

a.需求限制
在这里插入图片描述

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中默认变量非负);
要解决这个问题,我们需要建立一个线性规划模型,以确定如何切割原钢,使得在满足所有钢架需求的同时,浪费的原钢最小。以下是建立模型和使用MATLAB解决问题的基本步骤: 1. 定义决策变量:我们需要知道每根原钢被切割成多少段,以及每段的长度。设原钢长度为x1, x2, x3...分别对应不同长度的原钢。每根原钢可以切割成若干段,例如对于长度为7.4米的原钢,我们可以将其切割为2.9米和1.5米的两段,加上剩余的2.0米,但这不是最优解。 2. 建立目标函数:我们的目标是最小化浪费的原钢。因此,目标函数是所有切割后剩余部分长度的总和。设每根原钢被切割成的段数为n1, n2, n3...,则目标函数为minimize ∑(原钢长度 - n1*2.9 - n2*2.1 - n3*1.5)。 3. 约束条件:我们需要满足以下约束条件: - 每套钢架需要2.9米、2.1米和1.5米的原钢各一根。 - 每根原钢只能切割成符合需求长度的段数,不能多余。 - 每种长度的原钢至少需要100段。 4. 使用MATLAB的优化工具箱:我们可以使用MATLAB中的`linprog`函数来解决这个线性规划问题。首先需要将目标函数和约束条件转换成`linprog`函数所需的标准形式。 下面是一个简化的MATLAB代码示例,用于解决这个问题。请注意,这只是一个基础框架,实际的建模和求解过程可能会更复杂,需要根据实际情况调整模型和代码。 ```matlab % 定义目标函数的系数,即每种剩余长度的负系数 f = [-2.9; -2.1; -1.5]; % 我们想要最大化原钢的使用,所以用负值 % 定义不等式约束 A*x <= b % 这里需要根据实际切割情况来定义不等式约束,例如: % 每种长度的原钢至少需要100段 A = [1, 1, 1; -1, 0, 0; 0, -1, 0; 0, 0, -1]; % 每行代表一个约束 b = [100; 0; 0; 0]; % 第一行对应至少需要的段数,其余行对应原钢长度 % 定义线性等式约束 Aeq*x = beq Aeq = []; % 无等式约束 beq = []; % 无等式约束 % 定义变量的下界和上界 lb = [0, 0, 0]; % 每个决策变量的下界为0 ub = []; % 没有上界 % 求解线性规划问题 options = optimoptions('linprog','Algorithm','dual-simplex'); [x, fval] = linprog(f, A, b, Aeq, beq, lb, ub, options); % 输出结果 disp('决策变量:'); disp(x); disp('最小浪费长度:'); disp(-fval); % 因为我们用的是目标函数的负系数 ``` 需要注意的是,上述代码没有完全根据问题的实际情况进行建模,而是一个大致的框架。在实际应用中,需要根据具体的切割方案来详细定义目标函数和约束条件。此外,原钢的利用最大化意味着要最小化浪费,因此在`linprog`函数中应该使用目标函数的负系数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值