I have a bilevel model where my inner-level problem has terms in constraints and objective that are the product of an upper-level and a lower-level variable. For example,
using JuMP, BilevelJuMP, Gurobi
model = BilevelModel(Gurobi.Optimizer, mode = BilevelJuMP.SOS1Mode())
@variable(Lower(model), x <= 10)
@variable(Upper(model), y, Bin)
@objective(Upper(model), Min, 3x + y)
@objective(Lower(model), Min, -x*y)
@constraints(Lower(model), begin
x + y <= 8
x*y >= 5
end)
optimize!(model)
Now, my questions are:
-
I see that
BilevelJuMP
package can handle the product of variables in lower-level objective but not in lower-level constraints. Is there a way around it? My understanding is that sincey
is a parameter for the lower-level problem, it is an LP, and we can thus write its KKT condition as usual? Is the package not designed to handle it currently or is there any other reason? -
In the example above, I have a product of a binary and continuous variable, which can be linearized. So, is this what is recommended, i.e., should I linearize these terms and then re-write my lower problem? What if it was a product of two continuous variables? Even though
y
would still be a parameter for the lower-level problem making it an LP, what would be the suggested way to use theBilevelJuMP
package for such problems?
Looking for more insights on this. Thanks!