Howdy,
j'ai une question de barbare à poser à vous autres lettrés des maths : une histoire d'implémentation d'optimisation convexe avec contraintes inégalités.
Le problème en question est assez simple: trouver X* défini comme suit
Code:
X* = argmin(J) s.t J(X) = c.T X
sujet à
- [A] X = b, [A] est (6 x n)
- [G]X <= h, [G] est (2 n x n )
J'ai suivi l'approche décrite dans ce traité d'optimisation (à partir de la page 615). L'approche retenue fait appel à une fonction 'l' dite 'log barrier' qui vient avantageusement remplacer les contraintes inégalités dans une fonction de coût modifiée, de la forme
Code:
J(X|t) = t * c.T X + l(X|[G],h)
l est de la forme
Code:
l(X|[G],h) = - sum (log ( h_i - g_i.TX )
L'introduction de la log barrier permet donc de remplacer les inégalités initiales par une pénalité supplémentaire dans la fonction de coût, qui s'optimise alors presque comme un problème égalité classique : on fixe une valeur de t , on optimise J(X,t), on augmente t et on recommence. L'augmentation de t permet de 'raidir' la pente de la fonction de coût au voisinage des bornes de faisabilité du domaine.
La structure du problème est par ailleurs aidante, dans la mesure où [G] est le stacking de deux matrices proportionnelles à l'identité, et c un vecteur de 1.
J'ai implémenté cet algorithme, mais je ne suis pas satisfait par sa performance et sa robustesse numérique. J'ai constaté que si un nombre non négligeable de composantes de X s'approchent des bornes d'activation des contraintes d'egalité (à epsilon prêt), la matrice hessienne (la dérivée seconde de la fonction de coût) explose, ce qui me laisse perplexe quant à l'exactitude de l'incrément à X alors calculé. D'une manière générale, l'algorithme 'cale' alors, car la régularisation de dX ( on calcule X = X + alpha * dX avec alpha permettant de s'assurer que X satisfait au contraintes inégalités) amène à alpha = 0.
J'ai considéré implémenter un nouvel algorithme, celui ci basé sur la formulation dite 'primal/dual' comme il en est fait état à la section "11.7 Primal-dual interior-point methods" , mais j'ai l'impression que le système linéaire à résoudre est énorme (quelque chose comme n + 6 + 2n , contre seulement 6 avec la méthode log-barrier. Par ailleurs, la matrice du membre de gauche à l'équation (11.54) n'est pas symmétrique et nécessite donc une décomposition LU pour pouvoir résoudre le système, plutôt qu'une décomposition de Cholesky comme celle mise en oeuvre dans le cas de la log-barrier. Le combo dimension plus importante + perte de la symmétrie me fait donc un peu peur.
Bref, si je résume les deux méthodes
Log-barrier :
- Pros :
- Implémentée (bawi)
- ne nécessite que l'inversion d'un système 6x6 symmétrique
- Marche 'souvent' ...
- Cons
- ... mais pas tout le temps (activations simultanées de plusieurs contraintes inégalités qui met le dawa numérique)
- doublement itérative (besoin de choisir t, de résoudre un premier problème et d'itérer)
Primal-dual :
- Pros
- Simple itération
- Plus stable numériquement du fait de l'absence de 1 / epsilon au carré dans le système linéaire à inverser
- supposément plus rapide à converger que la log-barrier method
- Cons
- Système linéaire à inverser de grande dimension (6 + n + 2n) que la log barrier method et non symmétrique
- pas implémentée
J'aimerais pouvoir avoir un retour de praticien.nes de l'optimisation convexe avant de pouvoir me jeter dans l'implémentation de la méthode primal/dual, et d'éventuelles assurances sur sa mise en oeuvre.
Ai-je oublié qu'il me faut pouvoir implémenter ça en pur C ? Merci !