数学建模社区-数学中国
标题:
求助,帮忙修改一个变量
[打印本页]
作者:
KoWuDa
时间:
2013-10-23 20:11
标题:
求助,帮忙修改一个变量
这下面的代码是一个切割材料的东东,定长是6000,规定了一根材料上只能切割三种规格的长度,
我就搞不懂它是怎么完成这一步的,我看不出它是哪个地方作了限定.
现在,我想把它改成一根材料上只能切割四种规格,要怎么改呢?
MODEL:
! Uses Lingo's programming capability to do
on-the-fly column generation for a
cutting-stock problem;
SETS:
PATTERN: COST, X;
FG: WIDTH, DEM, PRICE, Y, YIELD;
FXP( FG, PATTERN): NBR;
ENDSETS
DATA:
PATTERN = 1..10; ! Allow up to 20 patterns;
RMWIDTH = 6000; ! Raw material width;
FG = F4 F6 F8 F9 F10;!Finished goods...;
WIDTH= 1816 916 616 439 602;!their widths...;
DEM = 1000 600 200 250 500;!and demands;
BIGM = 999;
ENDDATA
SUBMODEL MASTER_PROB:
[MSTROBJ] MIN= @SUM( PATTERN( J)| J #LE# NPATS:
COST( J)*X( J));
@FOR( FG( I):
[R_DEM]
@SUM( PATTERN( J)| J #LE# NPATS:
NBR( I, J) * X( J)) >= DEM( I);
);
ENDSUBMODEL
SUBMODEL INTEGER_REQ:
@FOR( PATTERN: @GIN( X));
ENDSUBMODEL
SUBMODEL PATTERN_GEN:
[SUBOBJ] MAX = @SUM( FG( I): PRICE( I)* Y( I));
@SUM( FG( I): WIDTH( I)*Y( I)) <= RMWIDTH;
@FOR( FG( I): @GIN(Y( I)));
ENDSUBMODEL
CALC:
! Set parameters;
@SET( 'DEFAULT');
@SET( 'TERSEO', 2); ! Turn off default output;
! Max number of patterns we'll allow;
MXPATS = @SIZE( PATTERN);
! Make first pattern an expensive super pattern;
COST( 1) = BIGM;
@FOR( FG( I): NBR( I, 1) = 1);
! Loop as long as the reduced cost is
attractive and there is space;
NPATS = 1;
RC = -1; ! Clearly attractive initially;
@WHILE( RC #LT# 0 #AND# NPATS #LT# MXPATS:
! Solve for best patterns to run among ones
generated so far;
@SOLVE( MASTER_PROB);
! Copy dual prices to PATTERN_GEN submodel;
@FOR( FG( I): PRICE( I) = -@DUAL( R_DEM( I)));
! Generate the current most attractive pattern;
@SOLVE( PATTERN_GEN);
! Marginal value of current best pattern;
RC = 1 - SUBOBJ;
! Add the pattern to the Master if it is attractive;
@IFC( RC #LT# 0:
NPATS = NPATS + 1;
@FOR( FG( I): NBR( I, NPATS) = Y( I));
COST( NPATS) = 1;
);
);
! Finally solve Master as an IP;
@SOLVE( MASTER_PROB, INTEGER_REQ);
ENDCALC
! This following calc section displays the
solution in a tabular format;
CALC:
! Compute yield of each FG;
@FOR( FG( F): YIELD( F) =
@SUM( PATTERN( J)| J #LE# NPATS:
NBR( F, J) * X(J))
);
! Compute some stats;
TOTAL_FT_USED = @SUM( PATTERN( I) | I #LE# NPATS: X( I)) * RMWIDTH;
TOTAL_FT_YIELD = @SUM( FG( I) | I #LE# NPATS: YIELD( I) * WIDTH( I));
PERC_WASTE = 100 * ( 1 - ( TOTAL_FT_YIELD / TOTAL_FT_USED)) ;
! Display the table of patterns and their usage;
FW = 6;
@WRITE( @NEWLINE( 1));
@WRITE( ' Total raws used: ', @SUM(PATTERN( I) | I #LE# NPATS: X( I)) , @NEWLINE( 2),
' Total feet yield: ', TOTAL_FT_YIELD , @NEWLINE( 1),
' Total feet used: ', TOTAL_FT_USED , @NEWLINE( 2),
' Percent waste: ', @FORMAT( PERC_WASTE, '#5.2G'), '%', @NEWLINE( 1));
@WRITE( @NEWLINE( 1), 24*' ', 'Pattern:', @NEWLINE( 1));
@WRITE( ' FG Demand Yield');
@FOR( PATTERN( I) | I #LE# NPATS: @WRITE( @FORMAT( I, '6.6G')));
@WRITE( @NEWLINE( 1));
@WRITE( ' ',FW*( NPATS+3)*'=', @NEWLINE( 1));
@FOR( FG( F):
@WRITE((FW - @STRLEN( FG( F)))*' ', FG( F), ' ',
@FORMAT( DEM( F), '6.6G'), @FORMAT( YIELD( F), '6.6G'));
@FOR( FXP( F, P) | P #LE# NPATS:
@WRITE( @IF( NBR( F, P) #GT# 0,
@FORMAT( NBR( F, P), "6.6G"), ' .')));
@WRITE( @NEWLINE( 1))
);
@WRITE( ' ',FW*( NPATS+3)*'=', @NEWLINE( 1));
@WRITE( 2*FW*' ', ' Usage:');
@WRITEFOR( PATTERN( P) | P#LE# NPATS: @FORMAT( X( P), '6.6G'));
@WRITE( @NEWLINE( 1));
ENDCALC
END
复制代码
作者:
李芳
时间:
2014-4-20 10:49
欢迎光临 数学建模社区-数学中国 (http://www.madio.net/)
Powered by Discuz! X2.5