Cplex中的Python稀疏矩阵?

2024-09-30 20:22:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在研究一个大的二次规划问题。我想使用pythonapi将定义目标函数的Q矩阵输入IBM的Cplex。Q矩阵是用scipy-lil矩阵构造的,因为它是稀疏的。理想情况下,我想把矩阵传给Cplex。Cplex接受scipy-lil矩阵吗?在

我可以把Q转换成Cplex接受的列表格式,我们称之为qMat。但是qMat的大小变得太大,机器内存不足(即使是120gig)。在

下面是我正在工作的代码。在实际问题中,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)

Tags: infromimportfordefcreate矩阵random
1条回答
网友
1楼 · 发布于 2024-09-30 20:22:38

如果n = 500000m = 5000000,则为2.5e12非零。对于其中的每一个,大约需要一个double作为非零值,一个CPXDIM作为索引。即8+4=12字节/非零。这将提供:

>>> print(2.5e12 * 12 / 1024. / 1024. / 1024.)
27939.6772385

大概有28B内存!目前还不清楚你到底打算有多少个非零,但通过这个计算,你可以很容易地发现是否有可能做到你所要求的。在

正如注释中提到的,cplexpythonapi不接受scipylil矩阵。您可以尝试docplex,这是numpy友好的,或者您甚至可以尝试直接生成一个LP file。在

在减少转换开销方面,使用下面这样的方法可能是最好的选择(我想我在上面的评论部分犯了一个错误):

^{pr2}$

或者

my_prob.objective.set_quadratic([[row, data] for row, data in zip(Q.rows, Q.data)]))

以任何速度和速度来看,你都应该看到。在

相关问题 更多 >