License Portal

Search
Close this search box.

trnloc1.run

				
					# ----------------------------------------
# BENDERS DECOMPOSITION FOR
# THE LOCATION-TRANSPORTATION PROBLEM
# ----------------------------------------

model trnloc1.mod;
data trnloc.dat;

option omit_zero_rows 1;
option display_eps .000001;

problem Master: Build, Max_Ship_Cost, Total_Cost, Cut_Defn;
   option display_1col 20;
   option solver cplex, cplex_options '';

problem Sub: Ship, Ship_Cost, Supply, Demand;
   option presolve 0;
   option display_1col 0;
   option solver cplex, cplex_options 'netopt 2 netfind 2';

let nCUT := 0;
let Max_Ship_Cost := 0;
let {i in ORIG} build[i] := 1;

param GAP default Infinity;

suffix dunbdd;

repeat { printf "\nITERATION %d\n\n", nCUT+1;

   solve Sub;
   printf "\n";

   if Sub.result = "infeasible" then {
      let nCUT := nCUT + 1;
      let cut_type[nCUT] := "ray";
      let {i in ORIG} supply_price[i,nCUT] := Supply[i].dunbdd;
      let {j in DEST} demand_price[j,nCUT] := Demand[j].dunbdd;
      expand Cut_Defn[nCUT];
      }
   else if Ship_Cost > Max_Ship_Cost + 0.00001 then {
      let GAP := min (GAP, Ship_Cost - Max_Ship_Cost);
      display GAP, Ship;
      let nCUT := nCUT + 1;
      let cut_type[nCUT] := "point";
      let {i in ORIG} supply_price[i,nCUT] := Supply[i].dual;
      let {j in DEST} demand_price[j,nCUT] := Demand[j].dual;
      }
   else break;

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

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

   let {i in ORIG} build[i] := Build[i];
};

option display_1col 0;
display Ship;