$title Stochastic Programming Example, reformulated for GAMS/DECIS (PRODSP2,SEQ=200) $onText The problem consists of determining the product mix for a furniture shop with two workstations: carpentry and finishing. The availability of labor in man-hours at the two stations is limited. There are four product classes, each consuming a certain number of man-hours at the two stations. Each product earns a certain profit and the shop has the option to purchase labor from outside. The objective is to maximize the profit. The problem is solved for 300 scenarios. See also PRODSP. King, A J, Stochastic Programming Problems: Examples from the Literature. In Ermoliev, Y, and Wets, R J, Eds, Numerical Techniques for Stochastic Optimization Problems. Springer Verlag, 1988, pp. 543-567. Keywords: linear programming, stochastic programming, production planning $offText $if not set decisalg $set decisalg decism Set i 'product class' / class-1*class-4 / j 'workstation' / work-1*work-2 / s 'nodes' / s1*s300 /; Parameter c(i) 'profit' / class-1 12, class-2 20, class-3 18, class-4 40 / q(j) 'cost' / work-1 5, work-2 10 / h(j,s) 'available labor' t(j,i,s) 'labor required'; Table trand(j,*,i) 'min and max values' class-1 class-2 class-3 class-4 work-1.min 3.5 8 6 9 work-1.max 4.5 10 8 11 work-2.min .8 .8 2.5 36 work-2.max 1.2 1.2 3.5 44; t(j,i,s) = uniform(trand(j,'min',i),trand(j,'max',i)); h('work-1',s) = normal(6000,100); h('work-2',s) = normal(4000, 50); *-------------------------------------------------------------------------- * first the original deterministic equivalent * this is a straight LP *-------------------------------------------------------------------------- Variable EProfit 'expected profit' x(i) 'products sold' v(j,s) 'labor purchased'; Positive Variable x, v; Equation obj 'expected cost definition' lbal(j,s) 'labor balance'; obj.. EProfit =e= sum(i, c(i)*x(i)) - 1/card(s)*sum((j,s), q(j)*v(j,s)); lbal(j,s).. sum(i, t(j,i,s)*x(i)) =l= h(j,s) + v(j,s); Model mix 'universe model' / obj, lbal /; mix.solPrint$(card(s) > 10) = %solPrint.quiet%; solve mix using lp maximizing eprofit; display eprofit.l, x.l; Parameter stage1(*,i) 'hold the stage 1 results'; stage1('deterministic',i) = x.l(i); *-------------------------------------------------------------------------- * Now the DECIS formulation *-------------------------------------------------------------------------- Equation obj2 'cost function' lbal2(j) 'labor balance' extra 'prevent unbounded relaxed master problem'; Variable profit 'to be maximized' v2(j) 'labor purchased'; Positive Variable v2; Parameter t2(j,i) 'mean values'; t2(j,i) = (trand(j,'min',i) + trand(j,'max',i))/2; Parameter h2(j) 'mean values' / work-1 6000, work-2 4000 /; obj2.. profit =e= sum(i, c(i)*x(i)) - sum(j, q(j)*v2(j)); lbal2(j).. sum(i, t2(j,i)*x(i)) =l= h2(j) + v2(j); extra.. sum(i, c(i)*x(i)) =l= 1000000; Model mix2 'decis model' / obj2, lbal2, extra /; * output the stochastic file using the scenarios * calculated above. This generates a large stochastic file. File stg / MODEL.STG /; put stg; put 'BLOCKS DISCRETE'/; loop(s, put 'BL BLOCK1 PERIOD2 ',(1/card(s)):8:6/; loop((i,j), put 'x ',i.tl,' lbal2 ',j.tl,' ',t(j,i,s):12:6/;); loop(j, put 'RHS lbal2 ',j.tl,' ',h(j,s):12:6/;); ); putClose; * output a MINOS option file File mopt / MINOS.SPC /; put mopt; put "begin"/; put "rows 1000"/; put "columns 1000"/; put "elements 100000"/; put "end"/; putClose; * assign stages x.stage(i) = 1; v2.stage(j) = 2; lbal2.stage(j) = 2; extra.stage = 1; option lp = %decisalg%; solve mix2 using lp maximizing profit; stage1('decis using scenarios',i) = x.l(i); *-------------------------------------------------------------------------- * Let DECIS solve the model exactly * Stochastic Universe option: 4 "ISTRAT" *-------------------------------------------------------------------------- File decopt / %decisalg%.opt /; put decopt; put '4 "ISTRAT"'/; putClose; mix2.optFile = 1; solve mix2 using lp maximizing profit; stage1('decis using scenarios, exact',i) = x.l(i); *-------------------------------------------------------------------------- * Better use of the stochastic file: independent distributions *-------------------------------------------------------------------------- Scalar p; p = 1/card(s); put stg; put 'INDEP DISCRETE'/; loop((i,j,s), put 'x ',i.tl,' lbal2 ',j.tl,' ',t(j,i,s):12:6,' PERIOD2 ',p:8:6/;); loop((j,s), put 'RHS lbal2 ',j.tl,' ',h(j,s):12:6,' PERIOD2 ',p:8:6/;); putClose; * this problem is way too big to solve exactly so turn off the * option strategy 4. mix2.optFile = 0; solve mix2 using lp maximizing profit; stage1('decis indep. dist.',i) = x.l(i); display stage1;