empbp05.gms : Bilevel model with MIN follower vs. VI follower

Description

This is a version of the model bard871 from the GAMS EMP Library

   Example from Chapter 8, example 8.7.1, page 358

   John F. Bard, Practical Bilevel Optimization: Algorithms and Applications,
   Kluwer Academic Publishers, Dordrecht, 1998.

Contributor: Jan-H. Jagla, December 2009


Small Model of Type : GAMS


Category : GAMS Test library


Main file : empbp05.gms

$title Bilevel model with MIN follower vs. VI follower (EMPBP05,SEQ=466)

$onText
This is a version of the model bard871 from the GAMS EMP Library

   Example from Chapter 8, example 8.7.1, page 358

   John F. Bard, Practical Bilevel Optimization: Algorithms and Applications,
   Kluwer Academic Publishers, Dordrecht, 1998.

Contributor: Jan-H. Jagla, December 2009

$offText

*The reported solution is
scalar x_l /11.25/
       y_l /    5/
       tol / 1e-3/;

positive variables x,y; variables objout,objin;
equations defout,defin,e1,e2;

defout.. objout =e= 16*sqr(x) + 9*sqr(y);
defin..  objin  =e= power(x+y-20,4);

e1.. -4*x + y =l= 0;
e2..  4*x + y =l= 50;

model bard / all /;

$echo bilevel x min objin * defin e2 > "%emp.info%"

*Start from reported solution
x.l = x_l ;
y.l = y_l;

solve bard us emp min objout;

abort$(  (abs(x.l - x_l ) > tol)
      or (abs(y.l - y_l ) > tol) ) 'Bard: Global solution not found';
abort$((bard.solvestat <> %solveStat.normalCompletion%) or
       (bard.modelstat <> %modelStat.locallyOptimal%  )) 'Bard: Wrong status codes';

*Now solve with follower formulated as VI
equations viin; viin.. 4*power(x+y-20,3) =N= 0;

model bard_vi / defout,e1,e2,viin /;

execute 'echo bilevel x vi viin y e2 > "%emp.info%"';

* Verify we get the same solution, but we cannot assume we get it
* in zero iterations: reformulations do not always work that way
solve bard_vi us emp min objout;

abort$(  (abs(x.l - x_l ) > tol)
      or (abs(y.l - y_l ) > tol) ) 'Bard_VI: Global solution not found';
abort$((bard.solvestat <> %solveStat.normalCompletion%) or
       (bard.modelstat <> %modelStat.locallyOptimal%  )) 'Bard_VI: Wrong status codes';