multi1a.run#
Warning
The original AMPL book does not reflect many of the latest features available in AMPL. To programmatically interact with your models you should use APIs such as our popular Python API.
# ----------------------------------------
# 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;