$title Transportation model as equilibrium problem (TRANSEQL,SEQ=45)
$onText
Dantzig's original transportation model TRNSPORT (in GAMS Model Library) is
reformulated using EMP's equilibrium system with multiple agents. It reproduces
the results of TRANSMCP (in GAMS Model Library) which uses a linear
complementarity approach.
As in TRANSMCP, we solve four models:
1. original fixed-demand LP to get calibration data
2. reproduce fixed-demand results with flexible-demand model
3. counter-factual with fixed-demand model
4. counter-factual with flexible-demand model
Dantzig, G B, Chapter 3.3. In Linear Programming and Extensions.
Princeton University Press, Princeton, New Jersey, 1963.
Contributor: Michael Ferris & Steven Dirkse, January 2010
$offText
Parameter report(*,*,*) summary report;
$call gamslib -q trnsport
* --- 1. now we solve the original fixed-demand trnsport model
$include trnsport
report(i,j,'fixed') = x.l(i,j);
report(i,"price",'fixed') = supply.m(i);
report("price",j,'fixed') = demand.m(j);
* now we introduce a flexible demand function
parameters esub(j) price elasticity of demand (at prices equal to unity)
/ new-york 1.5, chicago 1.2, topeka 2.0 /
pbar(j) reference price at demand node j;
variable p(j) shadow price at demand node j;
Equations flexdemand(j) price-responsive demand at market j
flexprofit profit definition ;
flexdemand(j).. sum(i, x(i,j)) =l= b(j)*(pbar(j)/p(j))**esub(j);
flexprofit.. z =e= sum((i,j), (p(j)-c(i,j))*x(i,j));
model emp trnsport model with flexible demand / flexprofit,supply,flexdemand /;
p.lo(j) = 1e-3; option limcol=0,limrow=0;
* use the EMP info file to define the price to be equal to the
* dual of the flexible demand equation
file fx / '%emp.info%' /;
put fx 'equilibrium';
put / 'max z x flexprofit supply flexdemand';
putclose / 'dualVar p flexdemand';
* calibrate the demand functions:
pbar(j) = demand.m(j);
* --- 2. replicate the fixed demand equilibrium
solve emp us emp;
report(i,j,"flex") = x.l(i,j);
report(i,"price",'flex') = supply.m(i);
report("price",j,"flex") = p.l(j);
report("profit",'',"flex") = sum((i,j), (p.l(j)-c(i,j))*x.l(i,j));
* prepare data for counter-factual
c("seattle","chicago") = 0.5 * c("seattle","chicago");
* --- 3. counter-factual with fixed demand
Solve transport min z us lp;
report(i,j,'fixed CF') = x.l(i,j);
report(i,"price",'fixed CF') = supply.m(i);
report("price",j,'fixed CF') = demand.m(j);
* --- 4. counter-factual with flexible demand
Solve emp us emp;
report(i,j,"flex CF") = x.l(i,j);
report(i,"price",'flex CF') = supply.m(i);
report("price",j,"flex CF") = p.l(j);
report("profit",'',"flex CF") = sum((i,j), (p.l(j)-c(i,j))*x.l(i,j));
Display report;
execute_unload 'eqlReport.gdx', report;