【问题标题】:Python sparse matrix in Cplex?Cplex中的Python稀疏矩阵?
【发布时间】: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


【解决方案1】:

如果 n = 500000m = 5000000,那么就是 2.5e12 个非零值。对于其中的每一个,您大约需要一个 double 用于非零值,一个 CPXDIM 用于索引。即每个非零 8+4=12 个字节。这将给出:

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

大约 28TB 的内存!目前尚不清楚您计划拥有多少个非零,但使用此计算,您可以轻松找出是否可以按照您的要求进行操作。

如 cmets 中所述,CPLEX Python API 不接受 scipy lil 矩阵。你可以试试docplex,它对numpy很友好,或者你甚至可以尝试直接生成一个LP file

就减少转换开销而言,使用以下内容可能是您最好的选择(我认为我在上面的 cmets 部分中犯了一个错误):

my_prob.objective.set_quadratic(list(zip(Q.rows, Q.data)))

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

无论如何,您都应该尝试一下,看看什么能提供最佳性能(在速度和内存方面)。

【讨论】:

    猜你喜欢
    • 2015-04-26
    • 2023-04-10
    • 2011-11-20
    • 2023-03-02
    • 1970-01-01
    • 1970-01-01
    • 2018-01-19
    • 2021-02-23
    • 2016-10-03
    相关资源
    最近更新 更多