Линейное программирование - границы с интервалами?

Это может показаться немного забавным вопросом, но есть ли способ запрограммировать уравнение LP с двумя «нижними» границами?

В основном моя проблема в том, что вместо обычных границ (0, x) для некоторой переменной 'a' я хочу иметь границы ((0 или i), x), где i и x - это диапазон чисел с плавающей запятой. Таким образом, если обнуление не оптимизирует его, он находит оптимальное значение между i и x; например (0,5,100), где оптимальное значение может быть либо нулем, либо числом с плавающей запятой где-то между 5 и 100.

Есть ли способ запрограммировать это в scipy linprog или PuLP? или есть более сложный решатель, который может справиться с такими ограничениями?


person beginner_python    schedule 09.05.2021    source источник
comment
Иногда это называют полунепрерывной переменной. Некоторые решатели и инструменты моделирования поддерживают это напрямую как тип переменной, но в других, таких как PuLP, вам нужно использовать двоичную переменную для моделирования этого.   -  person Erwin Kalvelagen    schedule 10.05.2021


Ответы (1)


Точный сценарий, который вы описываете, невозможен с использованием только LP (поэтому вы не сможете решить эту проблему с помощью linprog), но вы можете сделать что-то подобное с помощью MILP. Вы должны ввести двоичную переменную, скажем b, которая будет равна 0, если нижняя и верхняя граница равна 0, и 1, если у вас есть другая граница, тогда вы должны добавить ограничения b*i <= a и a <= b*x. Таким образом, когда b равно нулю, a должно быть равно нулю, а когда b равно 1, вы восстанавливаете свою границу i <= a <= x. Вы могли бы решить эту проблему с помощью Pulp.

person chthonicdaemon    schedule 09.05.2021
comment
имеет смысл - попробую, спасибо! - person beginner_python; 09.05.2021