$title Transportation model as equilibrium problem using embedded complementarity (TRANSECS,SEQ=14) $onText Dantzig's original transportation model TRNSPORT (in the GAMS Model Library) is reformulated using EMP in two ways: first as an embedded complementarity system or ECS (i.e. using a solve statement containing an objective variable and an EMP info file with the 'dualvar' directive), next as a single-agent equilibrium model (i.e. using a solve statement with no objective direction or variable and an EMP info file starting with the 'equilibrium' directive and specifying one agent, also with a 'dualvar' directive). Note that the two EMP models are different but equivalent ways to specify the same behavior. Each reproduces the results of TRANSMCP (in GAMS Model Library) which uses a linear complementarity approach. As in TRANSMCP, we have 4 steps: 1. original fixed-demand LP to get calibration data 2a. reproduce fixed-demand results with flexible-demand model using ECS (long-form solve statement specifying obj var & direction) 2b. same as 2a, but with short-form solve statement 3. counter-factual with fixed-demand model 4a. counter-factual with flexible-demand model (ECS) 4b. counter-factual with flexible-demand model (equilibrium) Dantzig, G B, Chapter 3.3. In Linear Programming and Extensions. Princeton University Press, Princeton, New Jersey, 1963. Contributor: Steven Dirkse, January 2009 $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; flexdemand(j).. sum(i, x(i,j)) =g= b(j)*(pbar(j)/p(j))**esub(j); model flex trnsport model with flexible demand / cost,supply,flexdemand /; p.lo(j) = 1e-3; option limcol=0,limrow=0; file fx / '%emp.info%' /; * calibrate the demand functions: pbar(j) = demand.m(j); * --- 2a. replicate the fixed demand equilibrium using ECS * use the EMP info file to define the price to be the * dual of the flexible demand equation put fx '* p(j) = flexdemand.m(j)'; putclose / 'dualvar p flexdemand'; solve flex using emp min z; report(i,j,"flex-a") = x.l(i,j); report(i,"price",'flex-a') = supply.m(i); report("price",j,"flex-a") = p.l(j); * report("profit",'',"flex") = sum((i,j), (p.l(j)-c(i,j))*x.l(i,j)); * --- 2b. replicate the fixed demand equilibrium, using 'equilibrium' put fx / 'equilibrium' /; put fx / 'min z x cost flexdemand supply' /; putclose fx / 'dualvar p flexdemand' /; solve flex using emp; report(i,j,"flex-b") = x.l(i,j); report(i,"price",'flex-b') = supply.m(i); report("price",j,"flex-b") = p.l(j); * prepare data for counter-factual c("seattle","chicago") = 0.5 * c("seattle","chicago"); * --- 3. counter-factual with fixed demand Solve transport using lp min z; 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); * --- 4a. counter-factual with flexible demand put fx '* p(j) = flexdemand.m(j)'; putclose / 'dualvar p flexdemand'; Solve flex using emp min z; report(i,j,"flex CF-a") = x.l(i,j); report(i,"price",'flex CF-a') = supply.m(i); report("price",j,"flex CF-a") = p.l(j); * report("profit",'',"flex CF") = sum((i,j), (p.l(j)-c(i,j))*x.l(i,j)); * --- 4b. counter-factual with flexible demand, using 'equilibrium' put fx / 'equilibrium' /; put fx / 'min z x cost flexdemand supply' /; putclose fx / 'dualvar p flexdemand' /; solve flex using emp; report(i,j,"flex CF-b") = x.l(i,j); report(i,"price",'flex CF-b') = supply.m(i); report("price",j,"flex CF-b") = p.l(j); Display report; execute_unload 'ecsReport.gdx', report;