transport.gms : Classical transportation problem with MIRO

Description

```This problem finds a least cost shipping schedule that meets
requirements at markets and supplies at factories.
```

Category : GAMS Data Utilities library

Main file : transport.gms   includes :  transport.gms

``````\$title A Transportation Problem with multiple version LP/MIP/MINLP
\$onText
This problem finds a least cost shipping schedule that meets
requirements at markets and supplies at factories.

Dantzig, G B, Chapter 3.3. In Linear Programming and Extensions.
Princeton University Press, Princeton, New Jersey, 1963.

\$offText

Set
i      'canning plants'
j      'markets'
t      'available model types' / lp, mip, minlp /
locHdr 'location data header'  / lat, lng /;

\$onExternalInput
Singleton Set type(t) 'selected model type' / lp /;

Parameter
a(i<) 'capacity of plant i in cases'
/ Seattle     350
San-Diego   600 /

b(j<) 'demand at market j in cases'
/ New-york   325
Chicago   300
Topeka   275 /;

Table d(i,j) 'distance in thousands of miles'
New-York  Chicago  Topeka
Seattle         2.5       1.7     1.8
San-Diego       2.5       1.8     1.4;

Scalar f 'freight in dollars per case per thousand miles' / 90 /
minS 'minimum shipment (MIP- and MINLP-only)' / 100 /
beta 'beta (MINLP-only)' / 0.95 /;

Table ilocData(i,locHdr) 'Plant location information'
lat           lng
Seattle     47.608013  -122.335167
San-Diego   32.715736  -117.161087;

Table jlocData(j,locHdr) 'Market location information'
lat           lng
New-York   40.730610  -73.935242
Chicago    41.881832  -87.623177
Topeka     39.056198  -95.695312;
\$offExternalInput

Parameter
c(i,j) 'transport cost in thousands of dollars per case';
c(i,j) = f*d(i,j)/1000;

* input validataion
file log / miro.log /;
put log '------------------------------------'/;
put log '        Validating data'/;
put log '------------------------------------'/;
if(sum(i, a(i)) < sum(j, b(j)),
put log 'a:: Capacity insufficient to meet demand'/;
else
put log 'OK'/;
);
putclose log;

Variable
x(i,j) 'shipment quantities in cases'
z      'total transportation costs in thousands of dollars';

Positive Variable x;

Equation
cost        'define objective function'
supply(i)   'observe supply limit at plant i'
demand(j)   'satisfy demand at market j';

cost ..        z  =e=  sum((i,j), c(i,j)*x(i,j));

supply(i).. sum(j, x(i,j)) =l= a(i);

demand(j).. sum(i, x(i,j)) =g= b(j);

Model transportLP / all /;

scalar bigM big M;
bigM = min(smax(i,a(i)), smax(j,b(j)));

binary variable ship(i,j) '1 if we ship from i to j, otherwise 0';

equation minship(i,j) minimum shipment
maxship(i,j) maximum shipment;

minship(i,j) .. x(i,j) =g= minS * ship(i,j);
maxship(i,j) .. x(i,j) =l= bigM * ship(i,j);

Model  transportMIP / transportLP, minship, maxship / ;
option optcr = 0;

Equation
costnlp 'define non-linear objective function';
costnlp .. z  =e=  sum((i,j), c(i,j)*x(i,j)**beta) ;

Model transportMINLP / transportMIP - cost + costnlp /;

\$eval.Set type type.TL
\$if not set type \$set type lp

*some starting point
x.l(i,j) = 1;

solve transport%type% using %type% minimizing z;
abort\$(transport%type%.modelstat > 2 and transport%type%.modelstat <> 8) "No feasible solution found"

Set scheduleHdr 'schedule header' / 'lngP', 'latP', 'lngM', 'latM', 'cap', 'demand', 'quantities' /;

\$onExternalOutput
Parameter
schedule(i,j,scheduleHdr) 'shipment quantities in cases'
total_cost                'total transportation costs in thousands of dollars';
Table schedule;
\$offExternalOutput

total_cost = z.l;
schedule(i,j, 'lngP')       = iLocData(i,'lng');
schedule(i,j, 'latP')       = iLocData(i,'lat');
schedule(i,j, 'lngM')       = jLocData(j,'lng');
schedule(i,j, 'latM')       = jLocData(j,'lat');
schedule(i,j, 'cap')        = a(i);
schedule(i,j, 'demand')     = b(j);
schedule(i,j, 'quantities') = x.l(i,j);
``````