Я работаю над большой проблемой квадратичного программирования. Я хотел бы передать матрицу Q, определяющую целевую функцию, в IBM Cplex с помощью Python API. Матрица Q построена с использованием матрицы scipy lil, потому что она разреженная. В идеале я бы хотел передать матрицу в Cplex. Принимает ли Cplex матрицу scipy lil?
Я могу преобразовать Q в формат списка списков, который принимает Cplex, назовем его qMat. Но размер qMat становится слишком большим, и на машине заканчивается память (даже с 120 гигабайтами).
Ниже приведен код моей незавершенной работы. В реальной задаче n составляет около полумиллиона, а m - около 5 миллионов. В реальной задаче 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)
convert
доdef convert(Q): return [[Q.rows[k], Q.data[k]] for k in range(n-1)]
. - person rkersh   schedule 19.09.2018docplex
может решить проблему в облаке, и в этом случае локальное преобразование потенциально может быть пропущено. Последняя мысль заключается в том, что вы потенциально можете записать свою модель на диск в формате LP, а затем прочитать ее, а не создавать все сразу в памяти. - person rkersh   schedule 19.09.2018