请选择 进入手机版 | 继续访问电脑版

QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 5312|回复: 4

关于lingo解决钢管实际问题

[复制链接]
字体大小: 正常 放大

23

主题

8

听众

372

积分

升级  24%

  • TA的每日心情
    开心
    2014-10-4 18:19
  • 签到天数: 102 天

    [LV.6]常住居民II

    自我介绍
    本人是在校学生,即将参加有史以来的第一场国赛,希望能在这里获得帮助。
    发表于 2013-7-27 18:47 |显示全部楼层
    |招呼Ta 关注Ta
    本帖最后由 wujianjack2 于 2013-7-28 12:27 编辑

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

    问题:零售商如果采用的不同切割模式太多,将会导致生产过程的复杂化,从而增加生产和管理成本,所以该零售商规定采用的不同切割模式不能超过3种,此外,该客户需要 50根 4m长、20根6m长、15根8m长、10根5m长 的钢管,应该如何下料最节省?

    下面是书上的答案,可是我运行的时候就提示没有可行解?代码我检查过了,没有打错的。麻烦一下各位前辈给出建议或自己的方法解决这个问题。谢谢。
    (1)为什么下面的程序没有可行解?关键要点在哪里?应该怎样修改
    (2)或者可以发表你的解题过程。

    温馨提示:书上的答案是:最优解是:28根。


    model:
    title 钢管下料-最小化钢管根数的lingo模型;
    sets:
    !定义基本集合needs及其属性length,num;
    needs/1..4/:length,num;
    !定义基本集合cuts及其属性x;
    cuts/1..3/:x;
    !定义派生集合patterns(这是一个稠密集合)及其属性r;
    patterns(needs,cuts):r;
    endsets

    data:
    length=4 5 6 8;
    num =  50 10 20 25;
    capacity=19;
    enddata

    min=@sum(cuts(i):x(i));

    !满足需求约束;
    @for(needs(i):@sum(cuts(j):x(j)*r(i,j))>num(i));
    !合理切割模式约束;
    @for(cuts(j):@sum(needs(i):length(i)*r(i,j))<capacity);
    !合理切割模式约束;
    @for(cuts(j):@sum(needs(i):length(i)*r(i,j))>capacity-@min(needs(i):length(i)));
    !人为增加约束;
    @sum(cuts(i):x(i))>26;@sum(cuts(i):x(i))<31;
    !人为增加约束;
    @for(cuts(i)|i#lt#@size(cuts):x(i)>x(i+1));
    @for(cuts(j):@gin(x(j)));
    @for(patterns(i,j):@gin(r(i,j)));
    end
    zan

    21

    主题

    97

    听众

    3110

    积分

  • TA的每日心情
    奋斗
    2014-3-2 00:26
  • 签到天数: 243 天

    [LV.8]以坛为家I

      嗯,不错的问题!
      楼主的代码是没有问题的,其实程序中唯一的错误是数据段中NUM=50 10 20 15,楼主误将第四个数据输入成25了,改正后得到如下结果(仅给出部分相关结果):
      Local optimal solution found.
      Objective value:                              28.00000
      Extended solver steps:                          11
      Total solver iterations:                           770


      Model Title: 钢管下料 - 最小化钢管根数的LINGO模型

                           Variable           Value        Reduced Cost
                              X( 1)        10.00000            0.000000
                              X( 2)        10.00000            2.000000
                              X( 3)        8.000000            1.000000

    如果楼主还想了解其它方案,可以参见《LINGO和Excel在数学建模中的作用》这本书p52-p53,程序代码如下:

    MODEL:
    SETS:
    CUTFA/1..3/:X;
    !切割方法3种,X表示对应每种切割方法的钢管原材料根数;
    BUJ/1..4/:L,NEED;
    !四种部件,L是部件长度,NEED是每种部件的需求量;
    SHUL(CUTFA,BUJ):N;
    !第i种切割方法所切割出的第j种部件的数量用Nij表示;
    ENDSETS
    DATA:
    L=4 5 6 8;   NEED=50 10 20 15;
    ZL=19;  !ZL是每根钢管原材料的长度;
    ENDDATA
    MIN=@SUM(CUTFA:X);
    !目标函数是3种切割方法所切割的钢管总根数最少;
    @FOR(BUJ(J):@SUM(CUTFA(I):N(I,J)*X(I))>=NEED(J));
    !切割出的每种部件总数满足需求量;
    @FOR(CUTFA(I):@SUM(BUJ(J):N(I,J)*L(J))<=ZL);
    !每种切割方法切割出的部件长度之和必须小于19;
    @FOR(CUTFA(I):@SUM(BUJ(J):N(I,J)*L(J))>=16);
    !每种切割方法切割出的部件长度之各大于15(余料小于4);
    @FOR(SHUL:@GIN(N));@FOR(CUTFA:@GIN(X));
    !N和X都是整数;
    END

    运行结果如下(部分重要结果):
      Local optimal solution found.
      Objective value:                              28.00000
      Extended solver steps:                          107
      Total solver iterations:                          2995


                           Variable           Value        Reduced Cost
                                 ZL        19.00000            0.000000
                              X( 1)        10.00000            1.000000
                              X( 2)        10.00000            1.000000
                              X( 3)        8.000000            1.000000
                           N( 1, 1)        2.000000            0.000000
                           N( 1, 2)        1.000000            0.000000
                           N( 1, 3)        1.000000            0.000000
                           N( 1, 4)        0.000000            0.000000
                           N( 2, 1)        3.000000            0.000000
                           N( 2, 2)        0.000000            0.000000
                           N( 2, 3)        1.000000            0.000000
                           N( 2, 4)        0.000000            0.000000
                           N( 3, 1)        0.000000            0.000000
                           N( 3, 2)        0.000000            0.000000
                           N( 3, 3)        0.000000            0.000000
                           N( 3, 4)        2.000000            0.000000

    另外,楼主在贴代码里最好选用高级模式,勾选右边的“禁用表情”,这样更方便大家阅读代码,谢谢支持!

    点评

    数学不烦  是一个细心的朋友  发表于 2013-7-28 12:44
    数学不烦  好的,非常谢谢你的建议。采纳!  详情 回复 发表于 2013-7-28 12:39
    有什么好说的
    回复

    使用道具 举报

    23

    主题

    8

    听众

    372

    积分

    升级  24%

  • TA的每日心情
    开心
    2014-10-4 18:19
  • 签到天数: 102 天

    [LV.6]常住居民II

    自我介绍
    本人是在校学生,即将参加有史以来的第一场国赛,希望能在这里获得帮助。
    wujianjack2 发表于 2013-7-28 12:17
    嗯,不错的问题!
      楼主的代码是没有问题的,其实程序中唯一的错误是数据段中NUM=50 10 20 15,楼主误将 ...

    好的,非常谢谢你的建议。采纳!

    点评

    wujianjack2  哈哈,多谢支持!共勉!  详情 回复 发表于 2013-7-28 22:09
    回复

    使用道具 举报

    21

    主题

    97

    听众

    3110

    积分

  • TA的每日心情
    奋斗
    2014-3-2 00:26
  • 签到天数: 243 天

    [LV.8]以坛为家I

    数学不烦 发表于 2013-7-28 12:39
    好的,非常谢谢你的建议。采纳!

    哈哈,多谢支持!共勉!
    有什么好说的
    回复

    使用道具 举报

    0

    主题

    1

    听众

    5

    积分

    升级  0%

    该用户从未签到

    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 注册地址

    qq
    收缩
    • 电话咨询

    • 04714969085
    fastpost

    关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

    手机版|Archiver| |繁體中文 手机客户端  

    蒙公网安备 15010502000194号

    Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

    GMT+8, 2024-3-28 19:33 , Processed in 0.575699 second(s), 74 queries .

    回顶部