数学建模社区-数学中国

标题: 钢管切割问题 [打印本页]

作者: KoWuDa    时间: 2013-10-21 16:45
标题: 钢管切割问题
比如下面的题目:
原料长度:19m
客户长度:4m,6m,8m,5m
       数量:50,20,15,10

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

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


作者: wujianjack2    时间: 2013-10-21 19:08
   楼主你好!
   该问题似乎是《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

楼主可以参考下,我就不附上结果了。
作者: qlb061    时间: 2013-10-21 19:10
本帖最后由 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
复制代码

作者: qlb061    时间: 2013-10-21 19:14
本帖最后由 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

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

谢谢加分!
作者: wujianjack2    时间: 2013-10-21 19:32
qlb061 发表于 2013-10-21 19:21
谢谢加分!

   你应该被奖励,谢谢你的回答与支持!
作者: KoWuDa    时间: 2013-10-22 15:36
谢谢你们的回复啊,我这个就是例程,但我加上了一个规定,一根材料只能切三种长度.
我先得学习下你们发的代码.
稍后我会继续提问的,因为这个问题我是在程序里使用的,长度不固定,种类也不固定..
作者: KoWuDa    时间: 2013-10-22 16:33
本帖最后由 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    时间: 2013-10-22 16:51
这是别人给的一种解法,可我仔细看了下,那个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    时间: 2013-10-22 16:51
  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
复制代码

作者: qlb061    时间: 2013-10-22 18:30
本帖最后由 qlb061 于 2013-10-22 20:30 编辑

  x

作者: KoWuDa    时间: 2013-10-22 21:14
  1. MODEL:
  2. ! Uses Lingo's programming capability to do
  3.   on-the-fly column generation for a
  4.   cutting-stock problem;
  5. SETS:
  6.   PATTERN: COST, X;
  7.   FG: WIDTH, DEM, PRICE, Y, YIELD;
  8.   FXP( FG, PATTERN): NBR;
  9. ENDSETS

  10. DATA:
  11.   PATTERN = 1..10; ! Allow up to 20 patterns;
  12.   RMWIDTH = 6000;    ! Raw material width;
  13.   FG =  F4  F6  F8 F9 F10;!Finished goods...;
  14.   WIDTH= 1816 916 616 439 602;!their widths...;
  15.   DEM = 1000 600 200 250 500;!and demands;
  16.   BIGM = 999;
  17. ENDDATA

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

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

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

  35. CALC:

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

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

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

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

  67. ENDCALC

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




欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5