2016-06-06 8 views
0

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

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

+0

Вы используете C Callable Library и [CPXXcopyquad] (http://www.ibm.com/support/knowledgecenter/SSSA5P_12.6.3/ilog.odms.cplex.help/refcallablelibrary/qpapi/copyquad.html)? Если это так, эта функция уже принимает разреженное представление Q-матрицы (через qmatbeg, qmatcnt, qmatind, qmatval) ... Вы уже пробовали это? Какую ошибку вы получаете? – rkersh

+0

Я использую интерфейс matlab. – Yuki

ответ

0

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

Однако (ранее я не знал об этом), API MATLAB принимает один sparse matrix для Q-матрицы (см. Также раздел MATLAB API programming tips).

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

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 библиотека C++ , Python и т. Д.). Если вам интересно, примеры, которые поставляются с CPLEX, демонстрируют, как это делается.

+0

Я не эксперт MATLAB, поэтому я не знал, как использовать родные разреженные матрицы в MATLAB, и я не знал, что CPLEX их принял. Я внесла соответствующие изменения в свой ответ. Извините за любую путаницу, которую я, возможно, вызвал с этой точкой. – rkersh

 Смежные вопросы

  • Нет связанных вопросов^_^