Может ли Cplex принимать две разреженные матрицы в качестве входных данных для Q

Я пытаюсь минимизировать очень большую проблему двоичного квадратичного программирования с линейными ограничениями, используя CPLEX MATLAB API. Однако квадратичная функция f = x'Qx имеет очень плотную матрицу Q. Я могу переписать Q с очень разреженными матрицами U и A: Q = U A.

Следовательно, есть ли способ передать эти матрицы в CPLEX вместо полной матрицы Q (которая слишком велика для хранения)?


person Yuki    schedule 06.06.2016    source источник
comment
Вы используете вызываемую библиотеку C и CPXXcopyquad? Если да, то эта функция уже принимает разреженное представление матрицы Q (через qmatbeg, qmatcnt, qmatind, qmatval) .... Вы уже пробовали это? Какую ошибку вы получаете?   -  person rkersh    schedule 06.06.2016
comment
Я использую интерфейс Matlab.   -  person Yuki    schedule 08.06.2016


Ответы (1)


Нет, это невозможно с MATLAB API. Существует два MATLAB API: CPLEX для MATLAB Toolbox и класс Cplex. Соответствующие функции / поля в каждом будут иметь вид cplexmiqp и Cplex.Model.Q. Ни один из них не позволяет делать именно то, о чем вы просите.

Однако (я раньше не знал об этом), MATLAB API действительно принимает один разреженная матрица для Q-матрицы (см. также MATLAB API советы по программированию).

Например, эти два примера взаимозаменяемы:

cplex.Model.Q = [-33     6     0  0;
     6   -22  11.5  0;
     0  11.5   -11  0;
     0     0     0  0];

или, используя разреженную матрицу:

cplex.Model.Q = sparse([1, 1, 2, 2, 2, 3, 3], [1, 2, 1, 2, 3, 2, 3], [-33, 6, 6, -22, 11.5, 11.5, -11], 4, 4)

Это более очевидно с другими API (например, C Callable Library, C ++, Python и т. Д.). Если вам интересно, примеры, поставляемые с CPLEX, демонстрируют, как это делается.

person rkersh    schedule 08.06.2016
comment
Я не являюсь экспертом по MATLAB, поэтому я не знал, как использовать собственные разреженные матрицы в MATLAB, и не знал, что CPLEX их принял. Я внес соответствующие правки в свой ответ. Извините за любую путаницу, которую я мог вызвать по этому поводу. - person rkersh; 09.06.2016