Функция в CPLEX может решить только квадратичную задачу. А если функция затрат квадратична и ее нужно умножить на вектор обязательств, то она становится уравнением третьего порядка. Во многих статьях объясняется, как преобразовать квадратичную функцию в ступенчатую, и математический способ прост для понимания. Однако я не знаю, как поместить переданные функции в cplexmiqp() в Cplex, потому что матрицу коэффициентов трудно определить. Может ли кто-нибудь сказать мне, как реализовать этот вопрос в функции cplex, и, если возможно, образец программы будет очень полезен! Спасибо!
Как я могу решить Unit Commitment, вызвав CPLEX методом Mix Integer Quadratic Programming
Ответы (1)
Вы не умножаете стоимость на двоичную переменную. Вместо этого вы используете логические импликации для моделирования.
Вместо записи d*P^2, где d — двоичное число, а P — непрерывная переменная, вы вводите новую переменную, назовем ее B. Если d равно 0, то B должно быть равно нулю, иначе оно должно быть равно P. Ваша новая цель — B^2. Осталось только смоделировать логику
d = 0 implies B = 0
d = 1 implies B = P
Обычно это делается с использованием методов big-M. Если вы знаете, что P неотрицательно и ограничено сверху, скажем, 100, вы можете записать его как
0 <= B <= 100*d
-100*(1-d) <= P-B <= 100*(1-d)
Единственный образец кода, который я могу предоставить, — это пример слоя моделирования на основе MATLAB YALMIP, который можно использовать для интерфейса cplex http://users.isy.liu.se/johanl/yalmip/pmwiki.php?n=Examples.UnitCommitment