Смешанное целочисленное линейное программирование для ограничения ранжирования

Я пытаюсь написать смешанное целочисленное линейное программирование для ограничения, связанного с рангом конкретной переменной, следующим образом:

  • У меня есть X1, X2, X3, X4 в качестве переменных решения.
  • Существует ограничение, требующее определить i как ранг X1 (например, если X1 является наибольшим числом среди X1, X2, X3, X4, то i=1; если X1 является вторым по величине числом, то i=2, если X1 - третье по величине число, тогда i=3, иначе i=4)

Как я мог записать это ограничение в смешанное целочисленное линейное программирование?

1 ответ

Решение

Не просто. Вот попытка:

Сначала введите двоичные переменные y(i) за i=2,3,4

Тогда мы можем написать:

 x(1) >= x(i) - (1-y(i))*M   i=2,3,4
 x(1) <= x(i) + y(i)*M       i=2,3,4
 rank = 4 - sum(i,y(i))
 y(i) ∈ {0,1}                i=2,3,4

Вот M является достаточно большой константой (хорошим выбором является максимальный диапазон данных). Если ваш решатель поддерживает ограничения индикатора, вы можете немного упростить ситуацию.

Небольшой пример иллюстрирует это работает:

----     36 VARIABLE x.L  

i1 6.302,    i2 8.478,    i3 3.077,    i4 6.992


----     36 VARIABLE y.L  

i3 1.000


----     36 VARIABLE rank.L                =            3.000