Description
This is a fairly simple MPEC model with some useful features: a) it has a unique solution b) it contains all types of matches c) it can be run as an MCP as well as an MPEC This model is based on mpec01, but here we use =E=, =L=, and =G=, but not =N=. Contributor: Steve Dirkse, May 2004
Small Model of Type : MPEC
Category : GAMS Test library
Main file : mpec03.gms
$title MPEC model to test all types of matches, using =ELG= (MPEC03,SEQ=136)
$onText
This is a fairly simple MPEC model with some useful features:
a) it has a unique solution
b) it contains all types of matches
c) it can be run as an MCP as well as an MPEC
This model is based on mpec01, but here we use =E=, =L=, and =G=, but
not =N=.
Contributor: Steve Dirkse, May 2004
$offText
$if NOT set MTYPE $set MTYPE mpec
$if not set TESTTOL $set TESTTOL 1e-3
scalar tol / %TESTTOL% /;
variables
z 'objective var',
x 'upper-level control variable',
yL0 'state var: lower bounded, at lower bound',
yL1 'state var: lower bounded, basic',
yU1 'state var: upper bounded, basic',
yU2 'state var: upper bounded, at upper bound',
yF1 'state var: free, basic',
yB0 'state var: double bounded, at lower bound',
yB1 'state var: double bounded, basic',
yB2 'state var: double bounded, at upper bound';
x.l = 1;
yL0.lo = 0; yL0.up = inf; yL0.l = 1;
yL1.lo = 0; yL1.up = inf; yL1.l = 1;
yU1.lo = -inf; yU1.up = 2; yU1.l = 1;
yU2.lo = -inf; yU2.up = 2; yU2.l = 1;
yF1.lo = -inf; yF1.up = inf; yF1.l = 1;
yB0.lo = 0; yB0.up = 2; yB0.l = 1;
yB1.lo = 0; yB1.up = 2; yB1.l = 1;
yB2.lo = 0; yB2.up = 2; yB2.l = 1;
equations
obj,
fL0,
fL1,
fU1,
fU2,
fF1,
fB0,
fB1,
fB2;
obj.. z =e= sqr(x-1.0);
fL0.. 3 * yL0 + 1 * yL1 =G= x - 1;
fL1.. 1 * yL0 + 3 * yL1 =G= x + 2;
fU1.. 3 * yU1 + 1 * yU2 =L= x + 4;
fU2.. 1 * yU1 + 3 * yU2 =L= x + 10;
fF1.. yL0 + yL1 + yU1 + yU2 + 10 * yF1 + yB0 + yB1 + yB2 =E= x + 16;
fB0.. 3 * yB0 + 1 * yB1 + 1 * yB2 =E= x;
fB1.. 1 * yB0 + 3 * yB1 + 1 * yB2 =E= x + 4;
fB2.. 1 * yB0 + 1 * yB1 + 3 * yB2 =E= x + 10;
model alltypes /
$ifI '%MTYPE%' == 'mpec' obj,
fL0.yL0, fL1.yL1,
fU1.yU1, fU2.yU2,
fF1.yF1,
fB0.yB0, fB1.yB1, fB2.yB2 /;
* $onText this is the optimal solution
yL0.l=0;
yL1.l=1;
yU1.l=1;
yU2.l=2;
yF1.l=1;
yB0.l=0;
yB1.l=1;
yB2.l=2;
* $offText
option limcol=0,limrow=0;
$ifI NOT '%MTYPE%' == 'mpec' x.fx=1;
solve alltypes using %MTYPE%
$ifI '%MTYPE%' == 'mpec' minimizing z;
if {(alltypes.solvestat = %solveStat.capabilityProblems%),
abort$[alltypes.modelstat <> %modelStat.noSolutionReturned%] 'Wrong status codes',
alltypes.solvestat, alltypes.modelstat;
else
abort$[not(alltypes.solvestat = %solveStat.normalCompletion% and (alltypes.modelstat = %modelStat.optimal% or
alltypes.modelstat = %modelStat.locallyOptimal% or alltypes.modelstat = %modelStat.feasibleSolution%))] 'Wrong status codes', alltypes.solvestat,
alltypes.modelstat;
* check for correct solution
abort$(abs(yL0.l-0) > tol) 'var yL0.l should be 0', yL0.l;
abort$(abs(yL1.l-1) > tol) 'var yL1.l should be 1', yL1.l;
abort$(abs(yU1.l-1) > tol) 'var yU1.l should be 1', yU1.l;
abort$(abs(yU2.l-2) > tol) 'var yU2.l should be 2', yU2.l;
abort$(abs(yF1.l-1) > tol) 'var yF1.l should be 1', yF1.l;
abort$(abs(yB0.l-0) > tol) 'var yB0.l should be 0', yB0.l;
abort$(abs(yB1.l-1) > tol) 'var yB1.l should be 1', yB1.l;
abort$(abs(yB2.l-2) > tol) 'var yB2.l should be 2', yB2.l;
abort$(abs(fL0.l-0) > tol) 'equ fL0.l should be 0', fL0.l;
abort$(abs(fL1.l-2) > tol) 'equ fL1.l should be 2', fL1.l;
abort$(abs(fU1.l-4) > tol) 'equ fU1.l should be 4', fU1.l;
abort$(abs(fU2.l-6) > tol) 'equ fU2.l should be 6', fU2.l;
abort$(abs(fF1.l-16)> tol) 'equ fF1.l should be 16', fF1.l;
abort$(abs(fB0.l-2) > tol) 'equ fB0.l should be 2', fB0.l;
abort$(abs(fB1.l-4) > tol) 'equ fB1.l should be 4', fB1.l;
abort$(abs(fB2.l-6) > tol) 'equ fB2.l should be 6', fB2.l;
$ ifI not '%MTYPE%' == 'mpec' $goTo nompec
abort$(abs(x.l-1) > tol) 'var x.l should be 1', x.l;
abort$(abs(z.l-0) > tol) 'var z.l should be 0', z.l;
abort$(abs(obj.l-0) > tol) 'equ obj.l should be 0', obj.l;
$ label nompec
* TODO - add checks for .m values.
};