CVXPY пытается сформулировать большую проблему: ValueError: отрицательные измерения не допускаются.Проблема использования ОЗУ здесь? - PullRequest
0 голосов
/ 25 сентября 2019

Я столкнулся с проблемой, пытаясь запустить довольно большую проблему оптимизации, по моему мнению.Вы можете увидеть код ниже.Размер переменной b равен 500 x 96. Я пытаюсь сопоставить сумму профилей временных рядов (351236 x 15 минутных шагов) с большим профилем, сводя к минимуму их разницу.При той же формулировке и гораздо меньшей задаче (672 временных шага и переменная ab размера 10 x 5) проблема решается менее чем за 2 секунды без проблем.Но когда я запускаю его для решения проблемы полной шкалы, я получаю сообщение об ошибке, которое вы видите ниже.

Я запускаю это на Jupyter Lab и python 3.7.4.Установка на python выполняется с помощью conda.

Я ожидаю, что проблема решится так же, как и с гораздо меньшей проблемой.Но когда я запускаю этот, использование оперативной памяти увеличивается до 100 ГБ (около 99% доступной оперативной памяти на сервере).Через некоторое время использование ОЗУ снижается, а затем начинается периодическое колебание (ОЗУ увеличивается и уменьшается с 50% до 100% каждые несколько минут).Из-за ошибки и после долгих поисков я подозреваю, что проблема слишком велика для памяти и что в какой-то момент данные разбиваются на более мелкие части.Я не думаю, что он достигает точки, где решатель делает свою работу.Я попытался оптимизировать код, векторизовав все (текущую версию) и стараясь не иметь циклов и т. Д. В формулировке.Но это ничего не изменило.Ребята, вы понимаете, является ли это ошибкой или ограничением?Или, может быть, у вас есть идея, как решить эту проблему?

X_opt = cp.Constant(np.asarray(X.iloc[:,:500])) # the array size is (35136,500)
K_opt = cp.Constant(np.asarray(K.YearlyDemand)) # the vector size is 96
b = cp.Variable((500,96),boolean = True, value = np.zeros((500,96)))
Y_opt = cp.Constant(np.asarray(y)) # the vector size is 35136

constraints = []

constraints.append( cp.sum(b, axis = 0) == 1 ) # the sum of the elements of every column of b must be equal to 1
constraints.append( cp.sum(b, axis = 1) <= 1 ) # the sum of the elements of every row of b must be smaller or equal to 1

objective = cp.Minimize(cp.sum(cp.abs(Y_opt-cp.sum((cp.diag(K_opt)*((X_opt@b).T)).T, axis = 1))))

prob = cp.Problem(objective, constraints)

prob.solve(solver = cp.GLPK_MI, verbose = True)

ValueError Traceback (последний последний вызов) в

D:\Anaconda3\envs\py37DuAL\lib\site-packages\cvxpy\problems\problem.py in solve(self, *args, **kwargs)
287 else:
288 solve_func = Problem._solve
--> 289 return solve_func(self, *args, **kwargs)
290
291 @classmethod

D:\Anaconda3\envs\py37DuAL\lib\site-packages\cvxpy\problems\problem.py in _solve(self, solver, warm_start, verbose, parallel, gp, qcp, **kwargs)
567 self._construct_chains(solver=solver, gp=gp)
568 data, solving_inverse_data = self._solving_chain.apply(
--> 569 self._intermediate_problem)
570 solution = self._solving_chain.solve_via_data(
571 self, data, warm_start, verbose, kwargs)

D:\Anaconda3\envs\py37DuAL\lib\site-packages\cvxpy\reductions\chain.py in apply(self, problem)
63 inverse_data = []
64 for r in self.reductions:
---> 65 problem, inv = r.apply(problem)
66 inverse_data.append(inv)
67 return problem, inverse_data

D:\Anaconda3\envs\py37DuAL\lib\site-packages\cvxpy\reductions\matrix_stuffing.py in apply(self, problem)
98 # Batch expressions together, then split apart.
99 expr_list = [arg for c in cons for arg in c.args]
--> 100 Afull, bfull = extractor.affine(expr_list)
101 if 0 not in Afull.shape and 0 not in bfull.shape:
102 Afull = cvxtypes.constant()(Afull)

D:\Anaconda3\envs\py37DuAL\lib\site-packages\cvxpy\utilities\coeff_extractor.py in affine(self, expr)
76 size = sum([e.size for e in expr_list])
77 op_list = [e.canonical_form[0] for e in expr_list]
---> 78 V, I, J, b = canonInterface.get_problem_matrix(op_list, self.id_map)
79 A = sp.csr_matrix((V, (I, J)), shape=(size, self.N))
80 return A, b.flatten()

D:\Anaconda3\envs\py37DuAL\lib\site-packages\cvxpy\cvxcore\python\canonInterface.py in get_problem_matrix(linOps, id_to_col, constr_offsets)
65
66 # Unpacking
---> 67 V = problemData.getV(len(problemData.V))
68 I = problemData.getI(len(problemData.I))
69 J = problemData.getJ(len(problemData.J))

D:\Anaconda3\envs\py37DuAL\lib\site-packages\cvxpy\cvxcore\python\cvxcore.py in getV(self, values)
320
321 def getV(self, values):
--> 322 return _cvxcore.ProblemData_getV(self, values)
323
324 def getI(self, values):

ValueError: negative dimensions are not allowed
...