QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 6097|回复: 11
打印 上一主题 下一主题

钢管切割问题

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

3

主题

7

听众

63

积分

升级  61.05%

  • TA的每日心情
    慵懒
    2013-11-2 11:08
  • 签到天数: 13 天

    [LV.3]偶尔看看II

    自我介绍
    菜鸟
    跳转到指定楼层
    1#
    发表于 2013-10-21 16:45 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    比如下面的题目:
    原料长度:19m
    客户长度:4m,6m,8m,5m
           数量:50,20,15,10

    如果,规定了同一根钢管上,只能切割三种长度,这样的约束条件怎么做成参数写进LINGO呢?有大神能帮忙看看吗?
    还有个问题,就是切割模式的枚举,可不可以也用LINGO来枚举呢?

    因为我是要在程序里面调用LINGO的,要是自己来写枚举的算法,好麻烦的...谢谢了!

    点评

    wujianjack2  3,4楼主会员qlb06提供1的例子很详细,推荐!  发表于 2013-10-21 19:17
    zan
    转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信

    21

    主题

    97

    听众

    3110

    积分

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

    [LV.8]以坛为家I

       楼主你好!
       该问题似乎是《LINGO和Excel在数学建模中的应用》这本书的例1.7.2,书中程序如下:
    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

    楼主可以参考下,我就不附上结果了。

    点评

    KoWuDa  谢谢你!  发表于 2013-10-22 19:11
    qlb061  Thank you!  详情 回复 发表于 2013-10-21 19:21
    有什么好说的
    回复

    使用道具 举报

    qlb061        

    3

    主题

    9

    听众

    3480

    积分

    升级  49.33%

  • TA的每日心情
    奋斗
    2018-4-27 20:25
  • 签到天数: 969 天

    [LV.10]以坛为家III

    自我介绍

    邮箱绑定达人

    群组LINGO

    本帖最后由 qlb061 于 2013-10-21 19:13 编辑
    1. <p>Lingo sample 文件中有此类模型,供参考
    2. MODEL:
    3. ! Uses Lingo's programming capability to do
    4.   on-the-fly column generation for a
    5.   cutting-stock problem;
    6. SETS:
    7.   PATTERN: COST, X;
    8.   FG: WIDTH, DEM, PRICE, Y, YIELD;
    9.   FXP( FG, PATTERN): NBR;
    10. ENDSETS

    11. DATA:
    12.   PATTERN = 1..20; ! Allow up to 20 patterns;
    13.   RMWIDTH = 19;    ! Raw material width;
    14.   FG =  F4  F6  F8  F5;!Finished goods...;
    15.   WIDTH= 4   6   8   5;!their widths...;
    16.   DEM = 50  20  15 10;!and demands;
    17.   BIGM = 999;
    18. ENDDATA

    19. SUBMODEL MASTER_PROB:
    20.   [MSTROBJ] MIN= @SUM( PATTERN( J)| J #LE# NPATS:
    21.    COST( J)*X( J));
    22.   @FOR( FG( I):
    23.    [R_DEM]
    24.     @SUM( PATTERN( J)| J #LE# NPATS:
    25.      NBR( I, J) * X( J)) >= DEM( I);
    26.   );
    27. ENDSUBMODEL

    28. SUBMODEL INTEGER_REQ:
    29.   @FOR( PATTERN: @GIN( X));
    30. ENDSUBMODEL

    31. SUBMODEL PATTERN_GEN:
    32.   [SUBOBJ] MAX = @SUM( FG( I): PRICE( I)* Y( I));
    33.   @SUM( FG( I): WIDTH( I)*Y( I)) <= RMWIDTH;
    34.   @FOR( FG( I): @GIN(Y( I)));
    35. ENDSUBMODEL

    36. CALC:

    37.   ! Set parameters;
    38.   @SET( 'DEFAULT');
    39.   @SET( 'TERSEO', 2); ! Turn off default output;

    40.   ! Max number of patterns we'll allow;
    41.   MXPATS = @SIZE( PATTERN);
    42.   ! Make first pattern an expensive super pattern;
    43.   COST( 1) = BIGM;
    44.   @FOR( FG( I): NBR( I, 1) = 1);

    45.   ! Loop as long as the reduced cost is
    46.     attractive and there is space;
    47.   NPATS = 1;
    48.   RC = -1;   ! Clearly attractive initially;
    49.   @WHILE( RC #LT# 0 #AND# NPATS #LT# MXPATS:
    50.     ! Solve for best patterns to run among ones
    51.        generated so far;
    52.     @SOLVE( MASTER_PROB);
    53.     ! Copy dual prices to PATTERN_GEN submodel;
    54.     @FOR( FG( I): PRICE( I) = -@DUAL( R_DEM( I)));
    55.     ! Generate the current most attractive pattern;
    56.     @SOLVE( PATTERN_GEN);
    57.     ! Marginal value of current best pattern;
    58.     RC = 1 - SUBOBJ;
    59.     ! Add the pattern to the Master if it is attractive;
    60.     @IFC( RC #LT# 0:
    61.        NPATS = NPATS + 1;
    62.        @FOR( FG( I): NBR( I, NPATS) = Y( I));
    63.        COST( NPATS) = 1;
    64.         );
    65.   );

    66.   ! Finally solve Master as an IP;
    67.   @SOLVE( MASTER_PROB, INTEGER_REQ);

    68. ENDCALC

    69. ! This following calc section displays the
    70.   solution in a tabular format;
    71. CALC:
    72.   ! Compute yield of each FG;
    73.   @FOR( FG( F): YIELD( F) =
    74.    @SUM( PATTERN( J)| J #LE# NPATS:
    75.     NBR( F, J) * X(J))
    76.   );
    77.   ! Compute some stats;
    78.   TOTAL_FT_USED = @SUM( PATTERN( I) | I #LE# NPATS: X( I)) * RMWIDTH;
    79.   TOTAL_FT_YIELD = @SUM( FG( I) | I #LE# NPATS: YIELD( I) * WIDTH( I));
    80.   PERC_WASTE =  100 * ( 1 - ( TOTAL_FT_YIELD / TOTAL_FT_USED)) ;
    81. ! Display the table of patterns and their usage;
    82.   FW = 6;
    83.   @WRITE( @NEWLINE( 1));
    84.   @WRITE( ' Total raws used:    ', @SUM(PATTERN( I) | I #LE# NPATS: X( I)) , @NEWLINE( 2),
    85.           ' Total feet yield:   ', TOTAL_FT_YIELD , @NEWLINE( 1),
    86.           ' Total feet used:    ', TOTAL_FT_USED , @NEWLINE( 2),
    87.           ' Percent waste:    ', @FORMAT( PERC_WASTE, '#5.2G'), '%', @NEWLINE( 1));
    88.   @WRITE( @NEWLINE( 1), 24*' ', 'Pattern:', @NEWLINE( 1));
    89.   @WRITE( '   FG  Demand Yield');
    90.   @FOR( PATTERN( I) | I #LE# NPATS: @WRITE( @FORMAT( I, '6.6G')));
    91.   @WRITE( @NEWLINE( 1));
    92.   @WRITE( ' ',FW*( NPATS+3)*'=', @NEWLINE( 1));
    93.   @FOR( FG( F):
    94.     @WRITE((FW - @STRLEN( FG( F)))*' ', FG( F), ' ',
    95.       @FORMAT( DEM( F), '6.6G'), @FORMAT( YIELD( F), '6.6G'));
    96.     @FOR( FXP( F, P) | P #LE# NPATS:
    97.       @WRITE( @IF( NBR( F, P) #GT# 0,
    98.       @FORMAT( NBR( F, P), "6.6G"), '     .')));
    99.     @WRITE( @NEWLINE( 1))
    100.   );
    101.   @WRITE( ' ',FW*( NPATS+3)*'=', @NEWLINE( 1));
    102.   @WRITE( 2*FW*' ', ' Usage:');
    103.   @WRITEFOR( PATTERN( P) | P#LE# NPATS: @FORMAT( X( P), '6.6G'));
    104.   @WRITE( @NEWLINE( 1));
    105. ENDCALC
    106. END
    复制代码

    点评

    KoWuDa  谢谢你!  发表于 2013-10-22 19:11
    已有 1 人评分体力 收起 理由
    wujianjack2 + 15 很给力!

    总评分: 体力 + 15   查看全部评分

    回复

    使用道具 举报

    qlb061        

    3

    主题

    9

    听众

    3480

    积分

    升级  49.33%

  • TA的每日心情
    奋斗
    2018-4-27 20:25
  • 签到天数: 969 天

    [LV.10]以坛为家III

    自我介绍

    邮箱绑定达人

    群组LINGO

    本帖最后由 qlb061 于 2013-10-21 19:16 编辑

    Total raws used:    28

    Total feet yield:   500
    Total feet used:    532

    Percent waste:      6.0%

                            Pattern:
       FG  Demand Yield     1     2     3     4     5     6     7
    ============================================================
        F4     50    50          1     4     .     .     1     1     3
        F6     20    20          1     .     3     .     .     1     1
        F8     15    15          1     .     .     2     .     1     .
        F5     10    12          1     .     .     .     3     .     .
    ============================================================
                      Usage:     0     0     0     4     4     7    13

    点评

    KoWuDa  超级给力  发表于 2013-10-22 19:11
    回复

    使用道具 举报

    qlb061        

    3

    主题

    9

    听众

    3480

    积分

    升级  49.33%

  • TA的每日心情
    奋斗
    2018-4-27 20:25
  • 签到天数: 969 天

    [LV.10]以坛为家III

    自我介绍

    邮箱绑定达人

    群组LINGO

    本帖最后由 qlb061 于 2013-10-21 19:22 编辑
    wujianjack2 发表于 2013-10-21 19:08
    楼主你好!
       该问题似乎是《LINGO和Excel在数学建模中的应用》这本书的例1.7.2,书中程序如下:
    MOD ...

    谢谢加分!

    点评

    KoWuDa  谢谢你的帮助!  发表于 2013-10-22 19:12
    wujianjack2  你应该被奖励,谢谢你的回答与支持!  详情 回复 发表于 2013-10-21 19:32
    回复

    使用道具 举报

    21

    主题

    97

    听众

    3110

    积分

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

    [LV.8]以坛为家I

    有什么好说的
    回复

    使用道具 举报

    KoWuDa        

    3

    主题

    7

    听众

    63

    积分

    升级  61.05%

  • TA的每日心情
    慵懒
    2013-11-2 11:08
  • 签到天数: 13 天

    [LV.3]偶尔看看II

    自我介绍
    菜鸟
    谢谢你们的回复啊,我这个就是例程,但我加上了一个规定,一根材料只能切三种长度.
    我先得学习下你们发的代码.
    稍后我会继续提问的,因为这个问题我是在程序里使用的,长度不固定,种类也不固定..
    回复

    使用道具 举报

    KoWuDa        

    3

    主题

    7

    听众

    63

    积分

    升级  61.05%

  • TA的每日心情
    慵懒
    2013-11-2 11:08
  • 签到天数: 13 天

    [LV.3]偶尔看看II

    自我介绍
    菜鸟
    本帖最后由 wujianjack2 于 2013-10-23 00:00 编辑

    MODEL:
    SETS:
    CUTFA/1..4/: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
    你们帮我看看这个解法,这里的X,实际上是规定了最后的切割模式的,我就没看出来,哪里是限制他只能切三种材料的地方.那个地方要是改成了4或10,就是切割模式被修改了...不符合我的要求啊.

    回复

    使用道具 举报

    KoWuDa        

    3

    主题

    7

    听众

    63

    积分

    升级  61.05%

  • TA的每日心情
    慵懒
    2013-11-2 11:08
  • 签到天数: 13 天

    [LV.3]偶尔看看II

    自我介绍
    菜鸟
    这是别人给的一种解法,可我仔细看了下,那个X不就是切割模式吗,他在限定切割的长度种类的时候,不也同时限定了切割模式了吗!这可不符合我的要求...我的切割模式不能固定的...
    model:
    SETS:
    NEEDS/1..4/:LENGTH,b;
    CUTS/1..3/:X;
    PATTERNS(NEEDS,CUTS):R;
    ENDSETS

    DATA:
    LENGTH=4 5 6 8;
    b=50 10 20 15;
    CAPACITY=19;
    ENDDATA
    min=@SUM(CUTS:X);
    @FOR(NEEDS(I):@SUM(CUTS(J):X(J)*R(I,J))>b(I));
    @FOR(CUTS(J):@SUM(NEEDS(I):LENGTH(I)*R(I,J))<CAPACITY;
    @SUM(NEEDS(I):LENGTH(I)*R(I,J))>CAPACITY-@MIN(NEEDS:LENGTH)+1);
    @SUM(CUTS:X)>26;
    @SUM(CUTS:X)<31;
    @FOR(CUTS(I)|I#LT#@SIZE(CUTS):X(I)>X(I+1));
    @FOR(CUTS:@GIN(X));
    @FOR(PATTERNS:@GIN(R));
    end
    回复

    使用道具 举报

    KoWuDa        

    3

    主题

    7

    听众

    63

    积分

    升级  61.05%

  • TA的每日心情
    慵懒
    2013-11-2 11:08
  • 签到天数: 13 天

    [LV.3]偶尔看看II

    自我介绍
    菜鸟
    1. model:
    2. SETS:
    3. NEEDS/1..4/:LENGTH,b;
    4. CUTS/1..3/:X;
    5. PATTERNS(NEEDS,CUTS):R;
    6. ENDSETS

    7. DATA:
    8. LENGTH=4 5 6 8;
    9. b=50 10 20 15;
    10. CAPACITY=19;
    11. ENDDATA
    12. min=@SUM(CUTS:X);
    13. @FOR(NEEDS(I):@SUM(CUTS(J):X(J)*R(I,J))>b(I));
    14. @FOR(CUTS(J):@SUM(NEEDS(I):LENGTH(I)*R(I,J))<CAPACITY;
    15. @SUM(NEEDS(I):LENGTH(I)*R(I,J))>CAPACITY-@MIN(NEEDS:LENGTH)+1);
    16. @SUM(CUTS:X)>26;
    17. @SUM(CUTS:X)<31;
    18. @FOR(CUTS(I)|I#LT#@SIZE(CUTS):X(I)>X(I+1));
    19. @FOR(CUTS:@GIN(X));
    20. @FOR(PATTERNS:@GIN(R));
    21. end
    复制代码
    回复

    使用道具 举报

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

    qq
    收缩
    • 电话咨询

    • 04714969085
    fastpost

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

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

    蒙公网安备 15010502000194号

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

    GMT+8, 2024-6-16 19:38 , Processed in 0.715437 second(s), 109 queries .

    回顶部