Description
Builds on transmcp and tests the 'sign flipping' for different solvelink values Contributor: Alex
Small Model of Type : GAMS
Category : GAMS Test library
Main file : mcp10.gms
$title MCP model with negative equ.var (MCP10,SEQ=604)
$onText
Builds on transmcp and tests the 'sign flipping' for different solvelink values
Contributor: Alex
$offText
Sets
i canning plants / seattle, san-diego /
j markets / new-york, chicago, topeka / ;
Parameters
a(i) capacity of plant i in cases (when prices are unity)
/ seattle 350
san-diego 600 /,
b(j) demand at market j in cases (when prices equal unity)
/ 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 /;
* changed distance to get some non-zero PIs on the supply constraint
Table d(i,j) distance in thousands of miles
new-york chicago topeka
seattle 2.5 1.7 1.8
san-diego 52.5 31.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 ;
Variables
x(i,j) shipment quantities in cases
z total transportation costs in thousands of dollars ;
positive variable x;
Equations
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) ;
* new equs and vars needed for mcp
Positive variables
w(i) shadow price at supply node i,
p(j) shadow price at demand node j;
Equations
supplyx(i) reoriented equation
profit(i,j) zero profit conditions;
profit(i,j).. w(i) + c(i,j) =g= p(j);
supplyx(i).. a(i) =g= sum(j, x(i,j));
* declare models including specification of equation-variable
* association:
models transport / cost,supply ,demand /
transx / cost,supplyx,demand /
transmcp / profit.x,-supply.w , demand.p/
transmcpX / profit.x, supplyx.w, demand.p/ ;
sets runs / lp,lpX,mcpX,0*6 /
slink(runs) / 0*6 /;
parameter rep(i,runs) Q&D summary report on supply marginals;
option limcol=0,limrow=0;
solve transport min z us lp;
rep(i,'lp') = -supply.m(I);
solve transx us lp min z;
rep(i,'lpX') = supplyx.m(I);
solve transmcpx us mcp;
rep(i,'mcpX') = supplyx.m(I);
option solprint=off;
scalar handle,count,rc;
loop {slink,
transmcp.solvelink=slink.val;
supply.m(i) = 0;
solve transmcp us mcp;
if {slink.val=3,
handle = transmcp.handle;
count = 0;
while {not handlecollect(handle),
abort$[count >= 10] 'waited but grid solve not finished';
count = count + 1;
display$sleep(0.1) 'was sleeping for 0.1 secs', count;
};
display$handledelete(handle) 'trouble deleting handle';
};
if {slink.val=6,
handle = transmcp.handle;
rc = readyCollect(handle,10);
abort$rc 'waited but multi-threaded solve not finished';
abort$[0=handlecollect(handle)] 'error collecting model solution';
display$handledelete(handle) 'trouble deleting handle';
};
rep(i,slink) = supply.m(I);
};
display rep;
parameter repx(i,runs) differences above tolerance;
repx(i,runs) = max(0,abs(rep(i,runs)-rep(i,'lp'))-1e-6);
display repx;
abort$card(repx) 'marginals are incorrect';