J'indique les matrices par des lettres majuscules, et les vecteurs par des lettres minuscules.
Je dois résoudre le système d'inégalités linéaires suivant pour le vecteur v
:
min(rv - (u + Av), v - s) = 0
donde 0
est un vecteur de zéros.
donde r
est un scalaire, u
y s
sont des vecteurs, et A
est une matrice.
Définition de z = v-s
, B=rI - A
, q=-u + Bs
Je peux réécrire le problème précédent comme suit . problème de complémentarité linéaire et espérer utiliser un solveur LCP, par exemple à partir de openopt
:
LCP(M, z): min(Bz+q, z) = 0
ou, en notation matricielle :
z'(Bz+q) = 0
z >= 0
Bz + q >= 0
Le problème est que mon système d'équations est énorme. Pour créer A
, I
- Créer quatre matrices
A11
,A12
,A21
,A22
en utilisantscipy.sparse.diags
- Et les empiler ensemble comme
A = scipy.sparse.bmat([[A11, A12], [A21, A22]])
- (Cela signifie également que
A
n'est pas symétrique, et donc certaines traductions efficaces enQP
les problèmes ne fonctionnent pas)
openopt.LCP
ne peut apparemment pas traiter les matrices éparses : Lorsque je l'ai exécuté, mon ordinateur a planté. En général, A.todense()
entraînera une erreur de mémoire. De même, compecon-python
n'est pas en mesure de résoudre LCP
problèmes avec des matrices éparses.
Quelle alternative LCP
sont adaptées à ce problème ?
Je ne pensais vraiment pas données de l'échantillon était nécessaire pour une question générale "quels outils pour résoudre les LCP" était nécessaire, mais quoi qu'il en soit, nous y voici
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>
Quelques conseils supplémentaires :
-
openopt.LCP
se plante avec mes matrices, je suppose qu'il convertit les matrices en dense avant de continuer -
compecon-python
échoue carrément avec une erreur, il requiert apparemment des matrices denses et n'a pas de solution de rechange pour la sparsité. -
B
n'est pas semi-définie positive, donc je ne peux pas reformuler le problème de complémentarité linéaire (LCP) comme un problème quadratique convexe (QP) - Tous les solveurs de QP sparse de cette exposition exigent que le problème soit convexe, ce que le mien n'est pas.
- A Julia, PATHSolver peut résoudre mon problème (avec une licence). Cependant, il y a des problèmes pour l'appeler depuis Python avec PyJulia ( mon rapport sur les problèmes ici )
- Matlab dispose également d'un solveur LCP qui peut apparemment gérer les matrices éparses, mais son implémentation est encore plus farfelue (et je ne veux vraiment pas me rabattre sur Matlab pour cela).