$title Educational bilevel model (JOINTC2, SEQ=23) $onText This is an example that shows that upper level joint constraints cannot simply be put into lower level model First model ----------- The lower level problem essentially requires y = -x which implies x <= 1 for the upper level problem. Since x has a lower bound of 1 the solution is x = 1, y = -1. Second model ------------ The upper level problem maximizes x s.t. no constraint, hence, x will be at its upper bound, x = 2. That implies y >= 0 for the lower level problem which minimzes y, hence y = 0. Contributor: Michael Ferris, November 2009 $offText variables x, y; equations upper, lower; upper.. y =g= x - 2; lower.. y =g= -x; model jc /all/; x.lo = 1; x.up = 2; y.up = 100; file fhandle /"%emp.info%"/; *First model putclose fhandle 'bilevel min y lower'; solve jc using emp max x; * check that solution is x = 1, y = -1 abort$(jc.solvestat <> %solveStat.normalCompletion% or ((abs(x.l-1) > 1e-6) or (abs(y.l-(-1)) > 1e-6)) ) 'Wrong solution: 1st model'; *Start from known solution x.l = 2; y.l = 0; *Second model putclose fhandle 'bilevel min y upper lower'; solve jc using emp max x; * check that solution is x = 2, y = 0 abort$(jc.solvestat <> %solveStat.normalCompletion% or ((abs(x.l-2) > 1e-6) or (abs(y.l-0) > 1e-6)) ) 'Wrong solution: 2nd model';