License Portal

Search
Close this search box.

multi1a.run

File from Additional Scripts: Looping and Testing – 2

				
					# ----------------------------------------
# DANTZIG-WOLFE DECOMPOSITION FOR
# MULTI-COMMODITY TRANSPORTATION
# ----------------------------------------

model multi1.mod;
data multi1.dat;

let nPROP := 0;
let price_convex := 1;
let {i in ORIG, j in DEST} price[i,j] := 0;

param phase symbolic, default "I";

option solver minos;
option omit_zero_rows 1;
option display_1col 10;
option display_eps .000001;

# ----------------------------------------------------------

problem Master: Artificial, Weight, Excess, Multi, Convex;
problem Sub: Artif_Reduced_Cost, Trans, Supply, Demand;

repeat { printf "\nPHASE %s -- ITERATION %d\n\n", phase, nPROP+1;

   solve Sub;
   printf "\n";
   display Trans;

   if phase = "I" then {
      if Artif_Reduced_Cost >= - 0.00001 then {
         printf "\n*** NO FEASIBLE SOLUTION ***\n";
         break;
         }
      }
   else {
      if Reduced_Cost >= - 0.00001 then {
         printf "\n*** OPTIMAL SOLUTION ***\n";
         break;
         }
      };

   let nPROP := nPROP + 1;
   let {i in ORIG, j in DEST}
      prop_ship[i,j,nPROP] := sum {p in PROD} Trans[i,j,p];
   let prop_cost[nPROP] := 
      sum {i in ORIG, j in DEST, p in PROD} cost[i,j,p] * Trans[i,j,p];

   solve Master;
   printf "\n";
   display Weight; 

   if phase = "I" then {
      display Multi.dual;
      display {i in ORIG, j in DEST} 
         limit[i,j] - sum {k in 1..nPROP} prop_ship[i,j,k] * Weight[k];

      if Excess <= 0.00001 then {
         printf "\nSETTING UP FOR PHASE II\n\n";
         let phase := "II";

         problem Master;
            drop Artificial; restore Total_Cost; fix Excess;
         problem Sub;
            drop Artif_Reduced_Cost; restore Reduced_Cost;

      #  problem Master; show obj; solve;
         solve Master;
         printf "\n";
         display Weight; display Multi.dual; display Multi.slack;
         };
      };

   let {i in ORIG, j in DEST} price[i,j] := Multi[i,j].dual;
   let price_convex := Convex.dual;
};

# ----------------------------------------------------------

printf "\nPHASE III\n\n";

problem MasterIII: Opt_Cost, Trans, Supply, Demand, Opt_Multi;

let {i in ORIG, j in DEST}
   opt_ship[i,j] := sum {k in 1..nPROP} prop_ship[i,j,k] * Weight[k];

solve MasterIII;
printf "\n";
display Trans;