【发布时间】:2018-09-18 17:00:09
【问题描述】:
我正在研究一个大型二次规划问题。我想使用 Python API 将定义目标函数的 Q 矩阵输入 IBM 的 Cplex。 Q 矩阵是使用 scipy lil 矩阵构建的,因为它是稀疏的。理想情况下,我想将矩阵传递给 Cplex。 Cplex 是否接受 scipy lil 矩阵?
我可以将 Q 转换为 Cplex 接受的列表格式,我们称之为 qMat。但是 qMat 的大小变得太大,机器内存不足(即使是 120 Gig)。
以下是我正在进行的代码。在实际问题中,n 约为 50 万,m 约为 500 万。在实际问题中,Q 是给定的,而不是像下面的问题那样随机分配。
from __future__ import division
import numpy as np
import cplex
import sys
import random
from scipy import sparse
n = 10
m = 5
def create():
Q = sparse.lil_matrix((n, n))
nums = random.sample(range(0, n), m)
for i in nums:
for j in nums:
a = random.uniform(0,1)
Q[i,j] = a
Q[j,i] = a
return Q
def convert(Q):
qMat = [[[], []] for _ in range(n)]
for k in xrange(n-1):
qMat[k][0] = Q.rows[k]
qMat[k][1] = Q.data[k]
return qMat
Q = create()
qMat = convert(Q)
my_prob = cplex.Cplex()
my_prob.objective.set_quadratic(qMat)
【问题讨论】:
-
不,CPLEX Python API 不接受 scipy lil 矩阵。 docplex 对 numpy 很友好,可能会接受它们,但它位于 CPLEX Python API 之上,因此必须进行相同的转换。最终,输入数据还必须先转换为本机 C 数组,然后才能传递到底层 CPLEX 引擎。
-
附带说明,为了消除一些开销,您可以将
convert函数减少到def convert(Q): return [[Q.rows[k], Q.data[k]] for k in range(n-1)]。 -
我编辑第一条评论说
docplex可以在云上解决已经太晚了,在这种情况下,本地转换可能会被绕过。最后一个想法是,您可能会以 LP 格式将模型写入磁盘,然后将其读入,而不是在内存中一次构建所有模型。
标签: python sparse-matrix cplex quadratic-programming