我正在尝试使用CPLEX MATLAB API最小化具有线性约束的非常大的二元二次规划问题。然而,二次函数 f = x'Qx 有一个非常密集的矩阵 Q。我可以用非常稀疏的矩阵 U 和 A 重写 Q:Q = U A。
因此,有没有办法将这些矩阵传递给 CPLEX,而不是完整的矩阵 Q(太大而无法存储)?
我正在尝试使用CPLEX MATLAB API最小化具有线性约束的非常大的二元二次规划问题。然而,二次函数 f = x'Qx 有一个非常密集的矩阵 Q。我可以用非常稀疏的矩阵 U 和 A 重写 Q:Q = U A。
因此,有没有办法将这些矩阵传递给 CPLEX,而不是完整的矩阵 Q(太大而无法存储)?
不,这对于 MATLAB API 是不可能的。有两个 MATLAB API:用于 MATLAB Toolbox 的 CPLEX 和 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 可调用库、C++、Python 等)更为明确。如果您有兴趣,CPLEX 附带的示例将演示如何完成。