钢管切割配料问题
发布日期:2021-07-22 10:54:30 浏览次数:4 分类:技术文章

本文共 3577 字,大约阅读时间需要 11 分钟。

某钢管零售商从钢管厂进货,将钢管按照顾客的要求切割后售出,从钢管厂进货时得到的原料钢管都是19m。

  1. 现有一客户需要50根4m,20根6m,15根8m的钢管,应该如何切割配料最省?
  2. 零售商如果采用的不同的切割模式太多,将会导致生产过程的复杂化,从而增加生产和管理成本,所以零售商规定采用的不同的切割模式不能超过3种。此外,该客户除了需要(1)中的三种钢管外,还需要10根5m的钢管,应该如何切割配料最省?

问题求解:

  1. 首先明确优化模型中的决策变量和目标函数。一根钢管有多种切割方案,直接从长度有困难,但可以由长度的约束条件规划出有限种可行的切割方式,再以切割方式的种类数量作为决策变量。然后其决策有两大目标函数,第一优化目标为原料钢管最省目标,第二优化目标为余料最省目标,即①切割的原料钢管数最少;②余料最少。之后可建立模型,求解。先优先考虑原料钢管数最少,再以最少的原料钢管数作为约束条件,求解余料最少的方案。
  2. 在增加切割子对象的基础上还需要对进行决策优化的参与每一种总方案的切割方式的种类及数量进行限制。在MATLAB中进行限制就是限制决策变量的上限ub。
  • MATLAB中变量说明以及数学模型中变量说明
  1. pipe_4(i),pipe_6(i),pipe_8(i),pipe_5:分别表示第i种可行的切割方式中在一根源钢管上切割成4m,6m,8m,5m的钢管的根数。在数学模型中用r(i),s(i),t(i),u(i)表示。
  2. K:表示所有的切割方式的总数。
  3. Cutways(j):表示第j种切割方式所切割的原钢管的根数。在数学模型中用x(i)表示。
  4. Totalpipenumber:表示切割的总的原钢管的总根数,是本题的第一优化目标。在数学模型中用T表示。
  5. Excess(i):第i种切割方式所剩余的余料。在数学模型中用e(i)表示。
  6. Totalexcess:总的余料长度,为本题的第二优化目标。在数学模型中用TE表示。
  • 建立模型
  1. 对于第一问建立数学多目标线性规划模型如下:

       

 

第二问的数学模型如下:

 

  • 模型求解
  1. MATLAB代码如下:

clc;%清空命令行

clear;%清除工作空间内容

G = zeros(1,4);%创建1*4的矩阵存储各种切割方式的三种钢管的根数以及余料量

pipe_4=0;pipe_6=0;pipe__8=0;%为三种钢管根数初始设置一个初始值。

i = 1;

%进行各个符合条件的切割方式进行遍历搜素并列举出来

for pip_4 = 0:1:4

   for pipe_6 = 0:1:3

       for pipe__8 = 0:1:2

           if (19-(4*pip_4+6*pipe_6+8*pipe__8)>=0) && (19-(4*pip_4+6*pipe_6+8*pipe__8)<=3)

               G(i,1) = pip_4;G(i,2)=pipe_6;G(i,3)=pipe__8;

               G(i,4) = 19-pip_4*4-pipe_6*6-pipe__8*8;

               i=i+1;

           end

       end

   end

end

  %将钢管切割方式存储变量G存储方式进行变形使得符合MATLAB整数规划函数要求的求解最小值的形式

A = zeros(3,i-1);

for ii = 1:7

    for jj = 1:3

        A(jj,ii) = -G(ii,jj);

    end

End

 %进行MATLAB运用intlinprog函数求解本问题最优解。

b = [-50;-20;-15];

C = ones(1,7);

intcon = ones(1,7);

lb = zeros(1,7);

ub = [inf,inf,inf,inf,inf,inf,inf];

[cutways,fval] = intlinprog(C,intcon,A,b,[],[],lb,ub)%cutways表示各种切割方式所切割的原钢管的根数,fval表示总原钢管根数

%在前面已经求得最少原钢管根数的前提条件下进行余料最少的目标线性优化

for i=1:7

   C(i) = G(i,4); %C(i)为第i钟分配方式的余料量

end

Aeq = ones(1,7);

beq = 25;

[finalcutways,fval1] = intlinprog(C,intcon,A,b,Aeq,beq,lb,ub)%finalcutways表示各种切割方式所切割的原钢管的根数,fval表示总原钢管根数

(2)

clc;%清空命令行

clear;%清除工作空间内容

G = zeros(1,5);%创建1*5的矩阵存储各种切割方式的四种钢管的根数以及余料量

pipe_4=0;pipe_6=0;pipe__8=0;pipe_5=0;

i = 1;

%进行各个符合条件的切割方式进行遍历搜素并列举出来

for pipe_4= 0:1:4

   for pipe_6 = 0:1:3

       for pipe_8 = 0:1:2

           for ppe_5 = 0:1:3

               if (19-(4*pipe_4+6*pipe_6+8*pipe_8+5*ppe_5)>=0) && (19-(4*pipe_4+6*pipe_6+8*pipe_8+5*ppe_5)<=3)

                   G(i,1) = pipe_4;G(i,2)=pipe_6;G(i,3)=pipe_8;G(i,4)=ppe_5;

                   G(i,5) = 19-pipe_4*4-pipe_6*6-pipe_8*8-ppe_5*5;

                   i=i+1;

               end

           end

       end

   end

end

  %将钢管切割方式存储变量G存储方式进行变形使得符合MATLAB整数规划函数要求的求解最小值的形式

A = zeros(4,i-1);

for ii = 1:i-1

    for jj = 1:4

        A(jj,ii) = -G(ii,jj);

    end

end

  %进行MATLAB运用intlinprog函数求解本问题最优解。

b = [-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;%只有三种切割方式数量不为零,其余都为0

           [x,fval] = intlinprog(C,intcon,A,b,[],[],lb,ub);%求解当任意三种切割方式组合时候最优目标解

           if minf > fval%保存最小目标解在minf变量中。

               minf = fval;

               x1 = x;

           end

           ub(X)=0;ub(Y)=0;ub(Z)=0;

        end

    end

end

minf%原料钢管数

x1

for 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%余料

  • 结果
  1. 解得是用钢管25根,余料35m.

可行的切割方式

4m

6m

8m

余料

最终最优解

1

0

0

2

3

0

2

0

3

0

1

0

3

1

1

1

1

10

4

1

2

0

3

0

5

2

0

1

3

5

6

3

1

0

1

10

7

4

0

0

3

0

  1. 输出结果原料钢管数为28根,余料34m.

可行的切割方式

4m

6m

8m

5m

余料

最终最优解

1

0

0

1

2

1

0

2

0

0

2

0

3

8

3

0

1

0

2

3

0

4

0

1

1

1

0

0

5

0

2

0

1

2

0

6

0

3

0

0

1

0

7

1

0

0

3

0

0

8

1

0

1

1

2

0

9

1

1

1

0

1

0

10

1

2

0

0

3

0

11

2

0

0

2

1

0

12

2

0

1

0

3

0

13

2

1

0

1

0

10

14

3

0

0

1

2

0

15

3

1

0

0

1

10

16

4

0

0

0

3

0

转载地址:https://blog.csdn.net/m0_56497861/article/details/118375535 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:十大常用的排序算法之冒泡排序 C#实现
下一篇:MATLAB基础知识:MATLAB在矩阵理论中的应用

发表评论

最新留言

哈哈,博客排版真的漂亮呢~
[***.90.31.176]2024年03月01日 18时15分18秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

南昌工程学院c语言答案,南昌工程学院C语言程序设计基础课件第3讲运算符和表达式... 2019-04-21
python学画画_python学画画(下) 2019-04-21
云栖社区 mysql_【直播结束,已更新回放】PG、MySQL到底哪个好?云栖说这次请来五位专家撕了一下-阿里云开发者社区... 2019-04-21
老男孩mysql 百度云_英语语录:除了你,没人能掌控你的幸福 2019-04-21
mysql驱动多次执行问题_Laravel5.2队列驱动expire参数设置带来的重复执行问题 数据库驱动... 2019-04-21
mysql获取刚新增的数据库_如何取得刚插入数据库的数据的id mysql 2019-04-21
python将10到1递减_(Python)如何将3个递减列表合并成一个递减列表? 2019-04-21
python脚本怎么用来处理数据_长时间运行数据处理python脚本的程序结构 2019-04-21
python转成c 语言_将Python对象转换为C void类型 2019-04-21
resin mysql_Eclipse+resin+mysql 安装及环境配置 2019-04-21
redis的使用 Java_java中使用redis 2019-04-21
java 数组元素位置_Java – 在数组中获取元素位置 2019-04-21
c 泛型与java泛型_C ++和Java中的“泛型”类型之间有什么区别? 2019-04-21
java 返回实体对象_java 封装返回结果实体类 返回结果以及错误信息 2019-04-21
java web 防止sql注入攻击_JavaWeb防注入知识点(一) 2019-04-21
java ssm 异常分类_SSM项目常见的异常与处理提示(一) 2019-04-21
java定义矩形类_Java定义矩形类 2019-04-21
java变量怎么变常量_Java的常量与变量是什么?怎么学习呀? 2019-04-21
java开发招聘试题_客户化开发招聘试题-Java开发.doc 2019-04-21
java jdk win10 1335_win10下安装java jdk,tomcat 2019-04-21