# outrata4-MPEC.mod # Original AMPL coding by Sven Leyffer, Argonne National Laboratory, 2004. # # MPEC formulation of ... # # Multi-Leader-Follower Game (MLF)) derived from outrata31-outrata34, # see J. Outrata, SIAM J. Optim. 4(2), pp.340ff, 1994. All Stackelberg # players have the same constraints, but different objectives. # ######################################################################### # ... parameters to give number of leaders param nl integer, default 4; # number of leaders set L := 1..nl; # set of leaders set I := 1..4; # ... useful index set # ... Stackelberg leaders' variables var x{L} >= 0, <= 10; var xa = sum{l in L} x[l] / card(L); # ... Followers' variables var y{I} >= 0; var s{I} >= 0; # ... multipliers (differ for each leader) var mF{L,I}; # multipliers of s = F(x,y) constraints var my{L,I} >= 0; # multipliers of y >= 0 var ms{L,I} >= 0; # multipliers of s >= 0 var mC{L,I} >= 0; # multipliers of Y s <= 0 var mx{L}; # multiplier of 0 <= x[l] <= L # ... definied variables model rhs of KKT conditions var kktx{l in L} = mF[l,1]*(0.2*y[1]-1.333) + mF[l,2]*(0.1*y[2]-1) + mF[l,3]*(-0.1) + mF[l,4]*0.1 + mx[l]*card(L); var kkty1{l in L} = mF[l,1]*(1+0.2*xa+2*y[4]) + mF[l,3]*0.333 + mF[l,4]*(-2*y[1]) + my[l,1] - mC[l,1]*s[1]; var kkty2{l in L} = mF[l,2]*(1+0.1*xa+2*y[4]) + mF[l,3]*(-1) + mF[l,4]*(-2*y[2]) + my[l,2] - mC[l,2]*s[2]; var kkty3{l in L} = mF[l,1]*(-0.333) + mF[l,2] + my[l,3] - mC[l,3]*s[3]; var kkty4{l in L} = mF[l,1]*(2*y[1]) + mF[l,2]*(2*y[2]) + my[l,4] - mC[l,4]*s[4]; # ... dummy objective minimize compl_mult: sum{l in L, i in I} mC[l,i]; subject to # ... FO conditions of leader 1 (gradients in (x[1],y)) KKT1x: 2*(x[1]-1) = kktx[1] / card(L); KKT1y1: 2*(y[1]-3) = kkty1[1]; KKT1y2: 2*(y[2]-4) = kkty2[1]; KKT1y3: 2*(y[3]-1) = kkty3[1]; KKT1y4: 20*y[4] = kkty4[1]; # ... FO conditions of leader 2 (gradients in (x[2],y)) KKT2x: 3*x[2] = kktx[2] / card(L); KKT2y1: 2*(y[1]-3) = kkty1[2]; KKT2y2: 2*(y[2]-4) = kkty2[2]; KKT2y3: 2*(y[3]-1) = kkty3[2]; KKT2y4: 20*y[4] = kkty4[2]; # ... FO conditions of leader 3 (gradients in (x[3],y)) KKT3x: 2*x[3] = kktx[3] / card(L); KKT3y1: 2*(y[1]-3) = kkty1[3]; KKT3y2: 2*(y[2]-4) = kkty2[3]; KKT3y3: 2*(y[3]-1) = kkty3[3]; KKT3y4: 20*y[4] = kkty4[3]; # ... FO conditions of leader 4 (gradients in (x[4],y)) KKT4x: 2*x[4] = kktx[4] / card(L); KKT4y1: 2*(y[1]-3) = kkty1[4]; KKT4y2: 2*(y[2]-4) = kkty2[4]; KKT4y3: 2*(y[3]-1) = kkty3[4]; KKT4y4: 20*y[4] = kkty4[4]; # ... first order conditions for the slacks (all players) KKTs{l in L, i in I}: 0 = - mF[l,i] + ms[l,i] - mC[l,i]*y[i]; # ... followers reponse to average of leaders (xa) nlcs1{l in L}: mF[l,1] complements s[1] = (1 + 0.2*xa)*y[1] - (3 + 1.333*xa) - 0.333*y[3] + 2*y[1]*y[4]; nlcs2{l in L}: mF[l,2] complements s[2] = (1 + 0.1*xa)*y[2] - xa + y[3] + 2*y[2]*y[4]; nlcs3{l in L}: mF[l,3] complements s[3] = 0.333*y[1] - y[2] + 1 - 0.1*xa; nlcs4{l in L}: mF[l,4] complements s[4] = 9 + 0.1*xa - y[1]^2 - y[2]^2; # ... complementarity constraints complx{l in L}: 0 <= x[l] <= 10 complements mx[l]; comply{l in L, i in I}: 0 <= y[i] complements my[l,i] >= 0; compls{l in L, i in I}: 0 <= s[i] complements ms[l,i] >= 0; complC{i in I}: 0 >= s[i]*y[i];