Кусочно-нелинейная функция стоимости в cplex
Можно ли смоделировать нелинейную кусочную функцию стоимости в Cplex?
Например что-то вроде цифр, которые я выложил здесь:
нелинейная поштучная функция стоимости (черная линия)
Я знаю, что одним из способов является линеаризация квадратичной части к линейной, но я хочу использовать квадратичную часть такой, какая она есть.
Вы можете видеть, что условие находится на самой переменной решения, функция стоимости может быть сформулирована следующим образом:
если x ≲ x0, то стоимость является квадратичной частью;
иначе стоимость является линейной частью.
Заранее спасибо:)
1 ответ
Один из способов - выбрать самую дешевую кривую в точке x:
min cost
cost ≥ f(x) − Mδ
cost ≥ g(x) − M(1−δ)
δ ϵ {0,1}
М является константой: наибольшая разница между двумя кривыми (т.е. M=|f(xmax)−g(xmax)|
). δ - бинарная переменная. Я предположил, что мы минимизируем стоимость и что квадратичная функция является выпуклой.
Эта конструкция реализует
min cost
cost ≥ f(x) or cost ≥ g(x)
Решатель всегда отбросит самую дорогую функцию и сохранит самую дешевую. На вашей картинке это именно то, что мы хотим: слева от x0
квадратичная функция является самой дешевой, и справа от x0
, линейная функция дешевле. Эта формулировка автоматически выберет более дешевый вариант.