热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

钢管下料问题用非线性整数规划的数学模型来建模以及用Lingo进行计算

其实对学过数学模型的童鞋来说,这个问题是标准的建模问题,没什么新意.之所以把这个东西拉出来过一遍,主要是因为,计算的时候(玩别的类似的东西的时候一样,但今天是计算)我内心特别高兴,有

其实对学过数学模型的童鞋来说,这个问题是标准的建模问题,没什么新意.


之所以把这个东西拉出来过一遍,主要是因为, 计算的时候(玩别的类似的东西的时候一样,但今天是计算)我内心特别高兴, 有一种无法表达的满足感, 算是一种休闲娱乐.

另外一个, 我知道整数规划是读研究生的时候; 而恰在此之前1年左右, 曾经在Nitto Denko待过很短一段时间, 实际中碰到非常类似的情形.


Nitto Denko在松江有分切工厂, 把日本import进来的原始的标准宽度的产品根据客户订单的需要进行切割. 每次订单都会来各种宽度规格和数量的需求.

我记得当时自己是负责接收订单, 跟客户确认各种细节, 然后再跟仓库确认库存现状, 确认好之后用邮件和电话对slitting工厂发出切割指令, 办妥之后再向客户确认订单,

签章之后Fax回传给客户.


向仓库和slitting工厂发出指令之前要计算需要的材料的种类和数量, 当时是用一个固定的带有比例系数的公式来计算的. 比如, 客户需要的全部产品的宽度加起来如果

是99, 那么订单乘以一个大于1的比例系数, 或者叫magic number, 万能比例系数, 比如1.13, 基本上就是需要的数量了. 不过有的时候,这个公式会失灵. 

我思来想去, 居然也没有一个头绪可以完美解决这个问题, 因为, 我又不是数学天才; 不过, 学了"最优化原理"之后, 我发现那个问题应该是这么解决的.


正是因为这个原因, 我对非线性整数规划这部分, 一直有特别的好感, 即使现在貌似也不大用的上了,还是想把Lingo拿出来, 重新写写代码, 轻松run一下.


照搬例题是非常轻松的事情. 所以, 下面就是一个照搬.


标准的钢管的长度是19m; 客户的订单需要 4m长的钢管50根, 5m长的钢管13根, 7m长的钢管9根, 9m长的钢管22根.

怎样安排切割废料最少? 怎样安排切割用的19m标准钢管最少?


好了, 现在就按照标准答案来解答.

假设5种不同切割模式, 每种各用标准钢管x1, x2, x3, x4, x5根

假设每根原始钢管通过 切割模式i可以得到客户所需的第j种规格(j=1,2,3,4, 对应规格4m, 5m, 7m, 9m)的钢管数量为rij;


标准钢管最少意味着 min=x1+x2+x3+x4+x5;

废料最少, 意味着不大于3的余料之和最少: min= 19*(x1+x2+x3+x4+x5)-4*(r11*x1+r21*x2+r31*x3+r41*x4+r51*x5)-5*(r12*x1+r22*x2+r32*x3+r42*x4)-7*(类似)-9*(类似)

还是线性的目标函数容易计算, 就算第一个吧, 偷笑

model:


sets:
voc/1..4/:length,number;
cut/1..5/:x;
pattern(voc,cut):r;
endsets

data:
length=4 5 7 9;
number=50 13 9 22;
origin=19;
enddata

min=@sum(cut(i):x(i));
@for(voc(i):@sum(cut(j):x(j)*r(i,j))>number(i));

@for(cut(j):@sum(voc(i):length(i)*r(i,j))@for(cut(j):@sum(voc(i):length(i)*r(i,j))>origin-@min(voc(i):length(i))+1);

@sum(cut(i):x(i))<@size(voc)+@sum(voc(j):@floor(number(j)/@floor(origin/length(j))));
@sum(cut(i):x(i))>@floor(@sum(voc(i):length(i)*number(i))/origin); !最简单算数平均的下届;

@for(voc(i):@sum(cut(j):x(j)*r(i,j))>number(i));!每一种长度的数量不小于客户需求数;

@for(cut(i):@gin(x(i)));
@for(pattern(i,j):@gin(r(i,j)));
end


局部最优解找到一个, 这种解应该比较多吧


  Local optimal solution found.
  Objective value:                              29.00000 需要原始材料29根
  Objective bound:                              29.00000
  Infeasibilities:                              0.000000
  Extended solver steps:                            3975
  Total solver iterations:                        131959


  Model Class:                                     PINLP


  Total variables:                     25
  Nonlinear variables:                 25
  Integer variables:                   25


  Total constraints:                   21
  Nonlinear constraints:                8


  Total nonzeros:                     135
  Nonlinear nonzeros:                  80


                                Variable           Value        Reduced Cost
                                  ORIGIN        19.00000            0.000000
                              LENGTH( 1)        4.000000            0.000000
                              LENGTH( 2)        5.000000            0.000000
                              LENGTH( 3)        7.000000            0.000000
                              LENGTH( 4)        9.000000            0.000000
                              NUMBER( 1)        50.00000            0.000000
                              NUMBER( 2)        13.00000            0.000000
                              NUMBER( 3)        9.000000            0.000000
                              NUMBER( 4)        22.00000            0.000000
                                   X( 1)        9.000000            1.000000
                                   X( 2)        11.00000            1.000000
                                   X( 3)        0.000000            1.000000
                                   X( 4)        2.000000            1.000000
                                   X( 5)        7.000000            1.000000
                                R( 1, 1)        3.000000            0.000000  第1种切割模式 长度为4的 3 根
                                R( 1, 2)        0.000000            0.000000  第2种切割模式, 长度为4的没

                               R( 1, 3)        1.000000            0.000000   第3种切割模式, 长度为4的 1根

                                R( 1, 4)        1.000000            0.000000 第4种切割模式 , 长度为4的1根
                                R( 1, 5)        3.000000            0.000000 第5种切割模式, 长度为4的3根
                                R( 2, 1)        0.000000            0.000000 第1种切割模式长度为5的 没有
                                R( 2, 2)        0.000000            0.000000 第2种切割模式, 长度为5的没
                                R( 2, 3)        0.000000            0.000000 第3种切割模式, 长度为5的没
                                R( 2, 4)        3.000000            0.000000 第4种切割模式, 长度为5的3根
                                R( 2, 5)        1.000000            0.000000 第5种切割模式, 长度为5的1根
                                R( 3, 1)        1.000000            0.000000 第1种切割模式长度为7的 1根
                                R( 3, 2)        0.000000            0.000000 第2种切割模式, 长度为7的没
                                R( 3, 3)        2.000000            0.000000 第3种切割模式, 长度为7的2根
                                R( 3, 4)        0.000000            0.000000 第4种切割模式, 长度为7的没有
                                R( 3, 5)        0.000000            0.000000 第5种切割模式, 长度为7的没有
                                R( 4, 1)        0.000000            0.000000 第1中切割模式, 长度为9的没有

                                R( 4, 2)        2.000000            0.000000 第2种切割模式, 长度为9的2根
                                R( 4, 3)        0.000000            0.000000 第3种切割模式, 长度为9的没有
                                R( 4, 4)        0.000000            0.000000 第4种切割模式, 长度为9的没有
                                R( 4, 5)        0.000000            0.000000 第5种切割模式, 长度为9的没有


                                     Row    Slack or Surplus      Dual Price
                                       1        29.00000           -1.000000
                                       2        0.000000            0.000000
                                       3        0.000000            0.000000
                                       4        0.000000            0.000000
                                       5        0.000000            0.000000
                                       6        0.000000            0.000000
                                       7        1.000000            0.000000
                                       8        1.000000            0.000000
                                       9        0.000000            0.000000
                                      10        2.000000            0.000000
                                      11        3.000000            0.000000
                                      12        2.000000            0.000000
                                      13        2.000000            0.000000
                                      14        3.000000            0.000000
                                      15        1.000000            0.000000
                                      16        6.000000            0.000000
                                      17        2.000000            0.000000
                                      18        0.000000            0.000000
                                      19        0.000000            0.000000
                                      20        0.000000            0.000000
                                      21        0.000000            0.000000





推荐阅读
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • 接下来要动手来做一个组件了,我想了一个计数器组件,功能方面是比较简单的,但这不是本章的重点,这一章的重点是说明一个组件的制作全过程。在其中可以学到很多组件制作的技巧,当然这些也是我从书上学得的。 ... [详细]
  • 自动调整列的宽度functionDBGridRecordSize(mColumn:TColumnEh):Boolean;{返回记录数据网格列显示最大宽度是否成功}beginResu ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 本文介绍了P1651题目的描述和要求,以及计算能搭建的塔的最大高度的方法。通过动态规划和状压技术,将问题转化为求解差值的问题,并定义了相应的状态。最终得出了计算最大高度的解法。 ... [详细]
  • 判断数组是否全为0_连续子数组的最大和的解题思路及代码方法一_动态规划
    本文介绍了判断数组是否全为0以及求解连续子数组的最大和的解题思路及代码方法一,即动态规划。通过动态规划的方法,可以找出连续子数组的最大和,具体思路是尽量选择正数的部分,遇到负数则不选择进去,遇到正数则保留并继续考察。本文给出了状态定义和状态转移方程,并提供了具体的代码实现。 ... [详细]
  • 本文详细介绍了Spring的JdbcTemplate的使用方法,包括执行存储过程、存储函数的call()方法,执行任何SQL语句的execute()方法,单个更新和批量更新的update()和batchUpdate()方法,以及单查和列表查询的query()和queryForXXX()方法。提供了经过测试的API供使用。 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • 也就是|小窗_卷积的特征提取与参数计算
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了卷积的特征提取与参数计算相关的知识,希望对你有一定的参考价值。Dense和Conv2D根本区别在于,Den ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 多任务多目标CTR预估技术
    简介: 多目标(MultiObjectiveLearning)是MTL中的一种。在业务场景中,经常面临既要又要的多目标问题。而多个目标常常会有冲突。如何使多个目标同时得到提升,是多 ... [详细]
  • fzu 1715 Ball and Box n个不同的求放到m个不同的盒子中方法的个数
    1715BallandBoxAccept:120Submit:288TimeLimit:1000mSecMemoryLimit:32768KBProblem ... [详细]
  • 一、MyEclipse中的一些常用的快捷键:ctrl+shift+x大写ctrl+shift+y小写alt+内容提示写住方法的时候可以先写main然后按alt+就可以了ctrl+1 ... [详细]
author-avatar
坏尐骇MB_549
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有