We can use the AMPL model file
transshipment.mod
(see
The Transshipment Problem in AMPL for details) to solve the American Steel Transshipment Problem. We need a data file to describe the nodes, arcs, costs and bounds. The node set is simply a list of the node names:
set NODES := Youngstown Pittsburgh
Cincinnati 'Kansas City' Chicago
Albany Houston Tempe Gary ;
Note that
Kansas City
must be enclosed in
'
and
'
because of the whitespace in the name.
The arc set is 2-dimensional and can be
defined in a number of different ways:
# List of arcs
set ARCS := (Youngstown, Albany), (Youngstown, Cincinnati), ... , (Chicago, Gary) ;
# Table of arcs
set ARCS: Cincinnati 'Kansas City' Chicago Albany Houston Tempe Gary :=
Youngstown + + + + - - -
Pittsburgh + + + - - - +
.
.
.
# Array of arcs
set ARCS :=
(Youngstown, *) Cincinnati 'Kansas City' Chicago Albany
(Pittsburgh, *) Cincinnati 'Kansas City' Chicago Gary
.
.
.
(Chicago, *) Tempe Gary
;
Since the node set is small and the arc set is "dense", i.e., many of the node pairs are represented in the arc set, we choose a
table to define ARCS:
set ARCS: Cincinnati 'Kansas City' Chicago Albany Houston Tempe Gary :=
Youngstown + + + + - - -
Pittsburgh + + + - - - +
Cincinnati - - - + + - -
'Kansas City' - - - - + + -
Chicago - - - - - + + ;
The
NetDemand
can be defined easily from the supply and demand. Since the default is 0 we don't need to define
NetDemand
for the transshipment nodes:
param NetDemand :=
Youngstown -10000
Pittsburgh -15000
Albany 3000
Houston 7000
Tempe 4000
Gary 6000
;
We can use
lists, tables or arrays to define the parameters for the American Steel Transhippment Problem,
but in this case we will use a list and
define multiple parameters at once. This allows us to "cut-and-paste" the parameters from the problem description. Note the use of
.
for parameters where the defaults will suffice (e.g.,
Lower
for
Youngstown
and
Albany
):
param: Cost Lower Upper:=
Youngstown Albany 500 . 1000
Youngstown Cincinnati 350 . 3000
Youngstown 'Kansas City' 450 1000 5000
Youngstown Chicago 375 . 5000
.
.
.
Chicago Gary 120 . 4000
;
Note that the cost is in $/1000 ton, so we must divide the cost by 1000 in our script file before solving:
reset;
model transshipment.mod;
data steel.dat;
let {(m, n) in ARCS} Cost[m, n] := Cost[m, n] / 1000;
option solver cplex;
solve;
display Flow;