Search
Close this search box.

stoch1.run

File from Additional Scripts: Looping and Testing – 2

				
					 # ----------------------------------------
# STOCHASTIC PROGRAMMING PROBLEM 
# USING BENDERS DECOMPOSITION
# ----------------------------------------

model stoch1.mod;
data stoch.dat;

option solver cplex;

option omit_zero_rows 1;
option display_eps .000001;

problem Master: Make1, Inv1, Sell1, Min_Stage2_Profit,
   Expected_Profit, Cut_Defn, Time1, Balance1;

problem Sub: Make, Inv, Sell, Stage2_Profit, Time, Balance2, Balance;

let nCUT := 0;
let Min_Stage2_Profit := Infinity;
let {p in PROD} inv1[p] := 0;

param GAP default Infinity;

for {1..50} { printf "\nITERATION %d\n\n", nCUT+1;

   solve Sub;
   printf "\n";

   if Stage2_Profit < Min_Stage2_Profit - 0.00001 then {
      let GAP := min (GAP, Min_Stage2_Profit - Stage2_Profit);
      option display_1col 0;
      display GAP, Make, Sell, Inv;
      let nCUT := nCUT + 1;
      let {t in 2..T, s in SCEN} time_price[t,s,nCUT] := Time[t,s].dual;
      let {p in PROD, s in SCEN} bal2_price[p,s,nCUT] := Balance2[p,s].dual;
      let {p in PROD, t in 2..T, s in SCEN} 
         sell_lim_price[p,t,s,nCUT] := Sell[p,t,s].urc;
      }
   else break;

   printf "\nRE-SOLVING MASTER PROBLEM\n\n";

   solve Master;
   printf "\n";
   option display_1col 20;
   display Make1, Inv1, Sell1;

   let {p in PROD} inv1[p] := Inv1[p];
};

printf "\nOPTIMAL SOLUTION FOUND\nExpected Profit = %f\n\n", Expected_Profit;
option display_1col 0;

param MAKE {p in PROD, t in 1..T, s in SCEN}
   := if t = 1 then Make1[p].val else Make[p,t,s].val;
param SELL {p in PROD, t in 1..T, s in SCEN}
   := if t = 1 then Sell1[p].val else Sell[p,t,s].val;
param INV {p in PROD, t in 1..T, s in SCEN}
   := if t = 1 then Inv1[p].val else Inv[p,t,s].val;

for {s in SCEN} {
   printf "SCENARIO %s\n", s;
   display {p in PROD, t in 1..T} 
      (MAKE[p,t,s], SELL[p,t,s], INV[p,t,s]);
   }