Optimisation de la gestion de stockage de l'énergie
Victor_20GC
Messages postés
7
Date d'inscription
Statut
Membre
Dernière intervention
-
yg_be Messages postés 23541 Date d'inscription Statut Contributeur Dernière intervention -
yg_be Messages postés 23541 Date d'inscription Statut Contributeur Dernière intervention -
Bonjour,
Je suis actuellement en stage et je fait face à un problème depuis quelque jours. Je débute en programmation informatique, et je dois écrire un algorithme d'optimisation. Malheureusement, j'ai vraiment du mal à savoir comment m'y prendre.
Je travaille sur le stockage de l'énergie, et je dois optimiser la gestion de l'unité de stockage, pour minimiser le coût pour le particulier.
On considère que ce dernier à une production et une consommation d'énergie connue un jour à l'avance.
Lorsqu'il consomme plus qu'il ne produit, il a 2 solutions pour rétablir l'équilibre : utiliser son stock d'énergie si celui-ci n'est pas vide, ou soutirer de l'énergie sur le réseau.
Dans le cas inverse où il produit plus qu'il ne consomme, il peut soit stocker son énergie ou alors la réinjecter sur le réseau.
Le but de cette optimisation est de minimiser le coût/maximiser le profit pour le particulier : il doit donc déstocker quand l'énergie du réseau est cher, et soutirer quand celle ci est peu chère. Quand il produit plus qu'il ne consomme, il vaut mieux vendre quand le prix de revente est cher, et stocker quand celui ci est peu cher. On considère bien entendu que les prix de revente et d'achat sont connus 24h à l'avance, et l'optimisation se fait sur ces 24h.
Je raisonne en puissance et voila l'expression du coût que j'ai trouvé dans le cas ou l'on consomme plus qu'on ne produit :
On note Pdst la puissance de déstockage et Psout celle de soutirage, et diff=conso-prod
Par ailleurs ak correspond au prix de revente de l'énergie, et bk le prix de soutirage sur le réseau. ak étant strictement inférieur à bk quelque soit k.
Déstocker de l'énergie revient à la payer au prix de revente car on aurait pu la revendre au lieu de l'utiliser. (pour l'instant je considère les rendements de stockage et de déstockage égaux à 1)
Le but est donc de choisir le bon Pdst[k] à chaque heure.
Les contraintes sont les suivantes :
Et à chaque tour de boucle je dois calculer le nouveau stock qui à l'expression suivante :
J'espère que c'est assez clair, n'hésitez pas à me poser des questions dans le cas contraire. J'aurais vraiment besoin d'un petit coup de pouce, car je ne trouve pas d'algorithme d'optimisation dont les contraintes dépendes du temps...
Je suis actuellement en stage et je fait face à un problème depuis quelque jours. Je débute en programmation informatique, et je dois écrire un algorithme d'optimisation. Malheureusement, j'ai vraiment du mal à savoir comment m'y prendre.
Je travaille sur le stockage de l'énergie, et je dois optimiser la gestion de l'unité de stockage, pour minimiser le coût pour le particulier.
On considère que ce dernier à une production et une consommation d'énergie connue un jour à l'avance.
Lorsqu'il consomme plus qu'il ne produit, il a 2 solutions pour rétablir l'équilibre : utiliser son stock d'énergie si celui-ci n'est pas vide, ou soutirer de l'énergie sur le réseau.
Dans le cas inverse où il produit plus qu'il ne consomme, il peut soit stocker son énergie ou alors la réinjecter sur le réseau.
Le but de cette optimisation est de minimiser le coût/maximiser le profit pour le particulier : il doit donc déstocker quand l'énergie du réseau est cher, et soutirer quand celle ci est peu chère. Quand il produit plus qu'il ne consomme, il vaut mieux vendre quand le prix de revente est cher, et stocker quand celui ci est peu cher. On considère bien entendu que les prix de revente et d'achat sont connus 24h à l'avance, et l'optimisation se fait sur ces 24h.
Je raisonne en puissance et voila l'expression du coût que j'ai trouvé dans le cas ou l'on consomme plus qu'on ne produit :
On note Pdst la puissance de déstockage et Psout celle de soutirage, et diff=conso-prod
Par ailleurs ak correspond au prix de revente de l'énergie, et bk le prix de soutirage sur le réseau. ak étant strictement inférieur à bk quelque soit k.
Déstocker de l'énergie revient à la payer au prix de revente car on aurait pu la revendre au lieu de l'utiliser. (pour l'instant je considère les rendements de stockage et de déstockage égaux à 1)
cout[k]=ak*Pdst[k]+bk*Psout =ak*Pdst[k]+bk*(diff[k]-Pdst[k]) =(ak-bk)*Pdst[k]+bk*diff[k] cout= somme(cout[k]pour k=1...24)
Le but est donc de choisir le bon Pdst[k] à chaque heure.
Les contraintes sont les suivantes :
Pmin<=Pdst[k]<=max(Pmax, stock[k-1]/pas)
Et à chaque tour de boucle je dois calculer le nouveau stock qui à l'expression suivante :
stock[k]=stock[k-1]-Pdst[k]*pas
J'espère que c'est assez clair, n'hésitez pas à me poser des questions dans le cas contraire. J'aurais vraiment besoin d'un petit coup de pouce, car je ne trouve pas d'algorithme d'optimisation dont les contraintes dépendes du temps...
Configuration: Macintosh / Chrome 81.0.4044.113
A voir également:
- Optimisation de la gestion de stockage de l'énergie
- Espace de stockage gmail plein - Guide
- Optimisation pc - Accueil - Utilitaires
- Espace de stockage google - Guide
- Gestion de fichiers - Télécharger - Gestion de fichiers
- Stockage du téléphone - Accueil - Guide Android
5 réponses
yg_be
Messages postés
23541
Date d'inscription
Statut
Contributeur
Dernière intervention
Ambassadeur
1 584
bonjour,
Je suppose que tu fais ce stage dans le contexte d'études, et que tu as suivi une formation en optimisation et en programmation. https://www.commentcamarche.net/infos/25899-demander-de-l-aide-pour-vos-exercices-sur-ccm/
Je suis surpris de lire "les contraintes dépendes du temps": je ne vois pas ce que le temps vient faire dans ce contexte.
Quel algorithme d'optimisation choisirais-tu si les contraintes ne dépendaient pas du temps?
Je suppose que tu fais ce stage dans le contexte d'études, et que tu as suivi une formation en optimisation et en programmation. https://www.commentcamarche.net/infos/25899-demander-de-l-aide-pour-vos-exercices-sur-ccm/
Je suis surpris de lire "les contraintes dépendes du temps": je ne vois pas ce que le temps vient faire dans ce contexte.
Quel algorithme d'optimisation choisirais-tu si les contraintes ne dépendaient pas du temps?
Pardon si je ne suis pas claire, je vais essayer de l'être le plus possible.
Les données de départ sont la consommation, la production, ainsi que les tarifs d'achat et de revente d'électricité sur les 24 prochaines heures. On considérera dans un premier temps que tarif d'achat est toujours supérieur au tarif de revente pour éviter un achat d'électricité dans le seul but de la revendre.
Le but est de minimiser le coût pour le gérant de l'installation.
Ce coût, lorsque la consommation est plus grande que la production est défini par :
Dans le cas où la production est plus grande que la consommation, on peut parler de bénéfice qui s'écrirait comme tel :
Mon objectif est donc de minimiser ce coût (ou de maximiser le bénéfice), en stockant/déstockant plus ou moins à chaque pas de temps. Mon seul degré de liberté et donc mon paramètre à optimiser est cette puissance de stockage, toutes les autres données (consommation, production, tarifs) étant des données.
Ma seule contrainte pour l'instant sur le stockage est la suivante :
dans le cas d'un surplus de consommation :
dans le cas d'un surplus de production :
Et le stock s'actualise à chaque tour de boucle (donc à chaque pas horaire) comme suit :
J'espère avoir été plus claire... n'hésitez pas à me redemander des précisions si nécessaire, et encore une fois merci de votre aide.
Les données de départ sont la consommation, la production, ainsi que les tarifs d'achat et de revente d'électricité sur les 24 prochaines heures. On considérera dans un premier temps que tarif d'achat est toujours supérieur au tarif de revente pour éviter un achat d'électricité dans le seul but de la revendre.
Le but est de minimiser le coût pour le gérant de l'installation.
Ce coût, lorsque la consommation est plus grande que la production est défini par :
coût[k]=bk*diff[k] + (ak-bk)Pdst[k]en reprenant les notations précédentes.
Dans le cas où la production est plus grande que la consommation, on peut parler de bénéfice qui s'écrirait comme tel :
benef[k]=ak(Pst[k]-diff[k]). La différence entre la puissance stockée et le surplus de production (diff), est égal à la puissance réinjectée dans le réseau, vendu au tarif ak, d'où l'expression précédente du bénéfice. Le coût, que l'on peut considérer comme l'opposé du bénéfice, serait égal à -bénéfice, on aurait donc un 'coût négatif'.
Mon objectif est donc de minimiser ce coût (ou de maximiser le bénéfice), en stockant/déstockant plus ou moins à chaque pas de temps. Mon seul degré de liberté et donc mon paramètre à optimiser est cette puissance de stockage, toutes les autres données (consommation, production, tarifs) étant des données.
Ma seule contrainte pour l'instant sur le stockage est la suivante :
dans le cas d'un surplus de consommation :
Pmin<Pdst[k]<min(Pmax,stock[k-1]/pas)
dans le cas d'un surplus de production :
Pmin<Pst[k]<min(Pmax,(capacité-stock[k-1])/pas)
Et le stock s'actualise à chaque tour de boucle (donc à chaque pas horaire) comme suit :
stock[k]=stock[k-1]-P(d)st[k]*pas(la puissance étant négative quand on stock et positive quand on déstocke, on a bien une augmentation du stock lorsque l'on stock et une diminution lorsque l'on déstocke).
J'espère avoir été plus claire... n'hésitez pas à me redemander des précisions si nécessaire, et encore une fois merci de votre aide.
Je te demande d'expliquer plus clairement afin que toi, tu comprennes le problème, ce qui te permettra de le résoudre.
J'ai l'impression que tu cherches quelqu'un pour faire le travail à ta place. Ce n'est certainement pas ainsi que tu progresseras.
As-tu lu et compris le lien que je t'ai proposé à propos de la programmation linéaire?
Tu écris "Les données de départ sont la consommation, la production, ainsi que les tarifs d'achat et de revente d'électricité sur les 24 prochaines heures. On considérera dans un premier temps que tarif d'achat est toujours supérieur au tarif de revente pour éviter un achat d'électricité dans le seul but de la revendre." Représente donc tout cela sous une forme algébrique, en utilisant une notation que tu utiliseras pas la suite. Il n'y a pas d'autres données de départ?
Ensuite, quand tu auras fini cette partie, décris ce que tu recherches, et représente cela sous une forme algébrique.
Bien entendu, explique chaque nouvelle notation que tu introduis.
Ensuite, décris ce que tu veux optimiser.
Finalement, décris les contraintes, toujours sous forme algébrique.
J'ai l'impression que tu cherches quelqu'un pour faire le travail à ta place. Ce n'est certainement pas ainsi que tu progresseras.
As-tu lu et compris le lien que je t'ai proposé à propos de la programmation linéaire?
Tu écris "Les données de départ sont la consommation, la production, ainsi que les tarifs d'achat et de revente d'électricité sur les 24 prochaines heures. On considérera dans un premier temps que tarif d'achat est toujours supérieur au tarif de revente pour éviter un achat d'électricité dans le seul but de la revendre." Représente donc tout cela sous une forme algébrique, en utilisant une notation que tu utiliseras pas la suite. Il n'y a pas d'autres données de départ?
Ensuite, quand tu auras fini cette partie, décris ce que tu recherches, et représente cela sous une forme algébrique.
Bien entendu, explique chaque nouvelle notation que tu introduis.
Ensuite, décris ce que tu veux optimiser.
Finalement, décris les contraintes, toujours sous forme algébrique.
Bien entendu je ne souhaite pas que l'on résolve le problème à ma place, j'aimerais juste quelques petits conseils pour appréhender ce types de problèmes, car je ne m'y connais pas du tout et j'ai du mal à voir par où commencer.
J'ai déjà écrit sur papier le problème sous forme algébrique, je peux essayer de le retranscrire ici.
Je recherche à minimiser le coût sur 24h, qui s'écrit:
La puissance de stockage serait soumise aux contraintes suivantes :
Et il y aurait le stock à réactualiser à chaque pas de temps, mais je ne sais si je dois le considérer comme une contrainte :
Sur le papier je comprends ce qu'il faut faire : lorsque la consommation est excédentaire, il faut soutirer lorsque le prix d'achat de l'énergie est bas, et il vaut mieux déstocker quand il est haut.
Et lorsque l'on produit plus, il vaut mieux réinjecter lorsque le prix de revente est élevé et stocker lorsqu'il est bas.
Donc honnêtement, je pense avoir compris le problème, je n'ai juste aucune idée de comment le mettre en place en Python.
J'ai regardé le lien que vous m'avez conseillé, mais pour moi ce qui diffère dans mon problème, c'est que le stock n'est pas une contrainte, mais ce n'est pas non plus le vecteur à optimiser, je ne sais pas comment le gérer.
C'est pourquoi si vous avez une idée pour débuter, où un module qui pourrait m'aider, je pense que ça pourrait me débloquer.
J'ai déjà écrit sur papier le problème sous forme algébrique, je peux essayer de le retranscrire ici.
Données:
conso=[conso[0],conso[1],...,conso[23]]
prod=[prod[0],prod[1],...prod[23]]
prix_rev=[a[0],a[1],...,a[23]]
prix_ach=[b[0],b[1],...,b[23]]
diff=conso-prod
P=[P[0],P[1],...P[23]]vecteur dont il faut trouver les valeurs pour maximiser le coût
cout=[cout[0],cout[1],...,cout[23]]vecteurs dont les coordonnées découlent de celles de P
stock=[stock[0],stock[1],...,stock[23]]
Je recherche à minimiser le coût sur 24h, qui s'écrit:
cout_tot= somme(cout[k]) pour k appartenant à [0,23](je n'arrive pas à faire d'indentation ici)...
for k in range(24):
if diff[k]<0:
cout[k]=-a[k]*(P[k]-diff[k])
else :
cout[k]= b[k]*diff[k]+(a[k]-b[k])*P[k]
La puissance de stockage serait soumise aux contraintes suivantes :
Pmin<P[k]<min(Pmax,stock[k-1]/pas)selon que l'on stock ou déstocke.
Pmin<P<min(Pmax,(capacité-stock[k-1])/pas)
Et il y aurait le stock à réactualiser à chaque pas de temps, mais je ne sais si je dois le considérer comme une contrainte :
stock[k]=stock[k-1]-P[k]*pas
Sur le papier je comprends ce qu'il faut faire : lorsque la consommation est excédentaire, il faut soutirer lorsque le prix d'achat de l'énergie est bas, et il vaut mieux déstocker quand il est haut.
Et lorsque l'on produit plus, il vaut mieux réinjecter lorsque le prix de revente est élevé et stocker lorsqu'il est bas.
Donc honnêtement, je pense avoir compris le problème, je n'ai juste aucune idée de comment le mettre en place en Python.
J'ai regardé le lien que vous m'avez conseillé, mais pour moi ce qui diffère dans mon problème, c'est que le stock n'est pas une contrainte, mais ce n'est pas non plus le vecteur à optimiser, je ne sais pas comment le gérer.
C'est pourquoi si vous avez une idée pour débuter, où un module qui pourrait m'aider, je pense que ça pourrait me débloquer.
Tu n'as pas expliqué ce qu'était P.
Pourquoi écris-tu que que le stock n'est pas une contrainte?
N'as-tu pas d'autre contraintes, par exemple sur la capacité de la batterie?
Tu n'as pas exprimé la fonction à optimiser comme une équation linéaire de tes inconnues. Je pense que c'est un point de blocage.
Avant de mettre en place en Python, tu dois décider comment exprimer ton problème comme une programmation linéaire.
Pourquoi écris-tu que que le stock n'est pas une contrainte?
N'as-tu pas d'autre contraintes, par exemple sur la capacité de la batterie?
Tu n'as pas exprimé la fonction à optimiser comme une équation linéaire de tes inconnues. Je pense que c'est un point de blocage.
Avant de mettre en place en Python, tu dois décider comment exprimer ton problème comme une programmation linéaire.
ah excusez moi oui P est la puissance de stockage ou de déstockage.
Hum disons que l'expression du stock à l'instant k dépend de P[k], mais ce n'est pas une contrainte. En revanche le stock à l'instant k-1 peut être une contrainte sur P[k].
Et oui il y a d'autres contraintes mais celle sur la capacité de la batterie est englobée dans la contrainte sur la puissance de stockage (on ne peut pas stocker plus que (capacité-stock[k-1]/pas soit la place disponible dans la batterie).
Et ensuite, il me semble avoir exprimé ma fonction à optimiser (coût), lorsque j'écris :
C'est cette somme que je dois minimiser avec les cout[k] qui varient selon que l'excédentaire soit de la production ou de la consommation.
Hum disons que l'expression du stock à l'instant k dépend de P[k], mais ce n'est pas une contrainte. En revanche le stock à l'instant k-1 peut être une contrainte sur P[k].
Et oui il y a d'autres contraintes mais celle sur la capacité de la batterie est englobée dans la contrainte sur la puissance de stockage (on ne peut pas stocker plus que (capacité-stock[k-1]/pas soit la place disponible dans la batterie).
Et ensuite, il me semble avoir exprimé ma fonction à optimiser (coût), lorsque j'écris :
cout_tot= somme(cout[k]) pour k appartenant à [0,23]
for k in range(24):
if diff[k]<0:
cout[k]=-a[k]*(P[k]-diff[k])
else :
cout[k]= b[k]*diff[k]+(a[k]-b[k])*P[k]
C'est cette somme que je dois minimiser avec les cout[k] qui varient selon que l'excédentaire soit de la production ou de la consommation.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Mais du coup, il est quand même possible de l'optimiser non ? Est je vois pas trop en quoi elle n'est pas linéaire puisque c'est une somme de sous fonctions linéaire non ? les cout[k] sont des fonctions linéaires par rapport à la puissance de stockage il me semble.
Alors malheureusement je n'ai jamais fait d'optimisation algorithmique, seulement mathématiques et encore c'était des cas assez simples avec des fonctions convexes (méthodes de la descente du gradient principalement), et je n'ai pas réussi à appliquer le peu que je savais à mon problème.
Quand je dis que les contraintes dépendent du temps, je veux dire que la puissance de déstockage peut être limité par le stock à l'heure k-1.
Dans les quelques exemples assez simples d'optimisation linéaire que j'ai vu, les contraintes étaient fixes, moi mes Pdst[k] n'ont pas les mêmes contraintes car le stock évolue. Est-ce que c'est plus clair comme ça ?
J'ai regardé les modules osqp (methode prédictive mais je ne pense pas que je puisse l'appliquer dans mon cas), cvxopt, cvxpy... aucun ne semble correspondre à mon problème, du moins je n'arrive pas à faire le lien. Peut être avez vous une idée de module qui pourrait m'aider ? Peut ête dois-je faire du machine learning mais je ne m'y connais pas du tout.
Merci de votre aide
Je ne vois aucune description complète et concise de ce que tu connais, des données de départ.
Tu écris des formules en mélangeant les représentations, en mélangeant les données de départ et ce que tu recherches, et en introduisant un nombre important de variables inutiles.
Je ne vois aucune tentative de représenter le problème sous forme d'un programme linéaire, ni sous une autre forme aidant à la compréhension ou à la résolution.