数学建模社区-数学中国

标题: 求助,帮忙修改一个变量 [打印本页]

作者: KoWuDa    时间: 2013-10-23 20:11
标题: 求助,帮忙修改一个变量
这下面的代码是一个切割材料的东东,定长是6000,规定了一根材料上只能切割三种规格的长度,
我就搞不懂它是怎么完成这一步的,我看不出它是哪个地方作了限定.
现在,我想把它改成一根材料上只能切割四种规格,要怎么改呢?
  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
复制代码

作者: 李芳    时间: 2014-4-20 10:49





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