Bilevel model with multiple lower levels

Hi,

I’m currently working on a bilevel problem that has:

  • one lower level problem for each period
  • a single upper level problem that considers all the periods

How to code this kind of bilevel problem with “mode=BilevelJuMP.StrongDualityMode()” ?

Thanks

Hi @martina.gherardi, welcome to the forum.

I don’t think BilevelJuMP explicitly supports multiple lower levels yet. But @joaquimg can confirm.

There’s an open issue since 2019 about this: Multiple second level problems · Issue #1 · joaquimg/BilevelJuMP.jl · GitHub

If the lower levels are independent, then you could just write a single lower-level problem which contained all of the subproblems?

Hi Oscar,

Thanks for your reply.

The characteristics of my problem would require to write 24 lower levels (market-clearing problems), one for each hour.
Each clearing problem has

  • its own generation-demand balance constraint,
  • its own constraints on the minimum and maximum quantity offered by each generating unit.
    and determines the hourly clearing price as the dual variable of the balance constraint.
    The solution with the lowest cost must be chosen among all the solutions that meet these constraints.

I have not been able to code in Julia this problem because it appears that Julia admits a single lower level problem, as you suggested.

In your opinion,

  1. Are these kinds of lower levels (with the same structure replicating for each hour) an example of independent lower levels or not?
  2. If they are independent, how to code in Julia this particular case of multiple but independent lower levels?

Many thanks,
Martina

Independent lower level models mean:
each lower level model can only contain its own variables and upper level variables, no lower level variable can be shared between 2 lower level models.

no special structures is required, you problem seem to fit this case in a first sight.

this Gist has an example: Multiple lower level example · GitHub

this might become a tutorial at some point. I have been avoiding that hoping I can make that explicit in BilevelJuMP.