Skip to content

optimisation

paplessix edited this page Jul 7, 2020 · 7 revisions

Présentation du module d'optimisation.

L'optimisation est assurée par le module Optimizer de storage_optimisation/Optimizer.py.

Celui-ci est en charge de calculer la fonction de coût associé au stockage. Celle-ci est définie comme le produit scalaire entre le vecteur des opérations au jour le jour, et le vecteur des prix spots. Nous sommes donc dans un problème d'optimisation de programmation linéaire. où le vecteur des opérations est le vecteur correspondant à l'attribut evolution de notre stockage, c'est à dire le pourcentage du volume max échangé chaque jour (algébriquement), et le vecteur des prix est le vecteur de tous les prix sur la période de temps considérée.

On privilégiera le calcul avec numpy qui est optimisé pour scipy.

Aspect technique

La classe fonctionne de la façon suivante :

  • Le constructeur lie l'optimiseur à un stockage de la classe Stockage.
  • la méthode Optimizer.contraints_init, permet de créer toutes les fonctions de contraintes, elles sont au nombre de 6:
    • Contrainte 1 : La stratégie comprend des valeurs entre -1 et 1
    • Contrainte 2 : La contrainte vérifie que le volume est entre 0 et Vmax
    • Contrainte 3 : La contrainte vérifie que le soutirage respecte bien la limite de soutirage correspondant au volume de remplissage.
    • Contrainte 4 : La contrainte vérifie que l'injection respecte bien la limite d'injection correspondant au volume de remplissage.
    • Contrainte 5 : La contrainte vérifie que le volume est toujours inférieur au threshold/tunnel max
    • Contrainte 6 : La contrainte vérifie que le volume est toujours supérieur au threshold/tunnel min

L'optimiseur prend en compte le tunnel ou simplement ou seulement les thresholds suivant si l'on a activé l'option tunnel au moment de la création du stockage.

  • La méthode Optimizer.optimize permet de lancer l'optimisation. La méthode choisie est la méthode SLSQP, car c'est la plus rapide. Elle repose sur scipy.minimize

La méthode en elle même ne fait que modifier in-place l'attribut évolution de l'objet Stockage. Pour accéder aux résultats de l'optimisation on apelle l'attribut evolution de notre stockage. On peut calculer le profit réalisé en utilisant la fonction de coût définie dans optimizer.py en Un Benchmark montre que le coût de calcul augmente fortement plus les périodes considérées sont longues. Ainsi compter 100s pour une optimisation sur une année :

Edit, une optimisation de l'implémentation et une meilleure utilisation de numpy permet de réduire drastiquement le temps de calcul.

Ce qui permet de grandement diminuer les temps de calcul

Clone this wiki locally