transmcp.gms : Transportation Model as Equilibrium Problem

Description

Dantzig's original transportation model (TRNSPORT) is
reformulated as a linear complementarity problem. We first
solve the model with fixed demand and supply quantities, and
then we incorporate price-responsiveness on both sides of the
market.


Small Model of Type : MCP


Category : GAMS Model library


Main file : transmcp.gms

$title Transportation Model as Equilibrium Problem (TRANSMCP,SEQ=126)

$onText
Dantzig's original transportation model (TRNSPORT) is
reformulated as a linear complementarity problem. We first
solve the model with fixed demand and supply quantities, and
then we incorporate price-responsiveness on both sides of the
market.


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

Keywords: linear complementarity problem, transportation problem, equilibrium
          model, scheduling
$offText

Set
   i 'canning plants' / seattle,  san-diego /
   j 'markets'        / new-york, chicago, topeka /;

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 /
   esub(j) 'price elasticity of demand (at prices equal to unity)'
           / new-york   1.5
             chicago    1.2
             topeka     2.0 /;

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 /;

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

Parameter pbar(j) 'reference price at demand node j';

Positive Variable
   w(i)        'shadow price at supply node i'
   p(j)        'shadow price at demand node j'
   x(i,j)      'shipment quantities in cases';

Equation
   supply(i)   'supply limit at plant i'
   fxdemand(j) 'fixed demand at market j'
   prdemand(j) 'price-responsive demand at market j'
   profit(i,j) 'zero profit conditions';

profit(i,j)..  w(i) + c(i,j)  =g= p(j);

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

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

prdemand(j)..  sum(i, x(i,j)) =g= b(j)*(pbar(j)/p(j))**esub(j);

* declare models including specification of equation-variable association:
Model
   fixedqty / profit.x, supply.w, fxdemand.p /
   equilqty / profit.x, supply.w, prdemand.p /;

* initial estimate:
p.l(j) = 1;
w.l(i) = 1;

Parameter report(*,*,*) 'summary report';

solve fixedqty using mcp;
report(i,j,"fixed")       = x.l(i,j);
report("price",j,"fixed") = p.l(j);
report(i,"price","fixed") = w.l(i);

* calibrate the demand functions:
pbar(j) = p.l(j);

* replicate the fixed demand equilibrium using flexible demand func:
solve equilqty using mcp;
report(i,j,"flex")       = x.l(i,j);
report("price",j,"flex") = p.l(j);
report(i,"price","flex") = w.l(i);

* compute a counter-factual equilibrium using fixed demand func:
c("seattle","chicago") = 0.5*c("seattle","chicago");

solve fixedqty using mcp;
report(i,j,"fixed CF")       = x.l(i,j);
report("price",j,"fixed CF") = p.l(j);
report(i,"price","fixed CF") = w.l(i);

* compute a counter-factual equilibrium using flexible demand func:
solve equilqty using mcp;
report(i,j,"flex CF")       = x.l(i,j);
report("price",j,"flex CF") = p.l(j);
report(i,"price","flex CF") = w.l(i);

display report;
execute_unload 'mcpReport.gdx', report;