Ответ 1
Используйте SUMT by Stephen Boyd. Я использовал его раньше для линейных систем, у которых есть <= или >= ограничения, и он работает очень хорошо.
SUMT = Последовательная техническая техника с минимальной минимизацией.
Я указываю матрицы заглавными буквами, а векторы - маленькими буквами.
Мне нужно решить следующую линейную систему уравнений для v
.
rv >= u + Av
v >= s
Определяя z = v-s
, B=rI - A
, q=-u + BS
, я могу переписать предыдущую проблему как проблему линейной взаимодополняемости и надеемся использовать решатель LCP, например, от openopt
:
LCP(M, z): min(Bz+q, z) = 0
или, в матричной нотации:
z'(Bz+q) = 0
z >= 0
Bz + q >= 0
Проблема в том, что моя система уравнений огромна. Чтобы создать A
, I
A11
, A12
, A21
, A22
с помощью scipy.sparse.diags
A = scipy.sparse.bmat([[A11, A12], [A21, A22]])
A
не является симметричным, и, следовательно, некоторые эффективные переводы в QP
проблемы не будут работать) openopt.LCP
, по-видимому, не может иметь дело с разреженными матрицами: когда я побежал, мой компьютер разбился. Как правило, A.todense()
приведет к ошибке памяти. Аналогично, compecon-python
не может решить проблемы LCP
с разреженными матрицами.
Какие альтернативные реализации LCP
подходят для этой проблемы?
Я действительно не думал, что необходимы образцы данных для общего "того, какие инструменты для решения LCP" были заданы, но в любом случае здесь мы идем
from numpy.random import rand
from scipy import sparse
n = 3000
r = 0.03
A = sparse.diags([-rand(n)], [0])
s = rand(n,).reshape((-1, 1))
u = rand(n,).reshape((-1, 1))
B = sparse.eye(n)*r - A
q = -u + B.dot(s)
q.shape
Out[37]: (3000, 1)
B
Out[38]:
<3000x3000 sparse matrix of type '<class 'numpy.float64'>'
with 3000 stored elements in Compressed Sparse Row format>
Еще несколько указателей:
openopt.LCP
падает с моими матрицами, я предполагаю, что он преобразует матрицы в плотные, прежде чем продолжитьcompecon-python
ошибка сбоя с некоторой ошибкой, она, по-видимому, требует плотных матриц и не имеет резерва для разреженностиB
не является положительным полуопределенным, поэтому я не могу перефразировать проблему линейной комплементарности (LCP) как выпуклую квадратичную задачу (QP)Используйте SUMT by Stephen Boyd. Я использовал его раньше для линейных систем, у которых есть <= или >= ограничения, и он работает очень хорошо.
SUMT = Последовательная техническая техника с минимальной минимизацией.