ich schreibe momenten meine Studienarbeit und bin neu in Matlab. Nun geht es für mich darum herauszufinden, ob es mittels bintprog oder ähnlichen Funktionen möglich ist mein Problem zu lösen.
Ich habe (aufs einfachste heruntergebrochen) diese Funktion zu Optimieren:
ich versuche mal, das Problem mit meinen Worten wiederzugeben. Bitte korrigiere mich, wenn nötig.
Das vereinfachte Problem:
Du möchtest wissen, ob Du beim gegebenen Strompreis eine Einheit Strom kaufen (x2=1) oder verkaufen (x1=1) solltest, um den Gewinn zu maximieren.
Das vereinfachte Problem ist leicht zu lösen: Du musst verkaufen, denn sonst machst Du keinen Gewinn. Da sowohl die Menge als auch der Strompreis hier konstant sind, kann Gewinn nur zwei Werte annehmen: +Strompreis, wenn x1 = 1 und -Strompreis, wenn x2 = 1 ist. Ich glaube, dass ist nicht wirklich Dein Problem. Wir sollten also gleich das richtige Problem angehen.
Das richtige Problem:
Du möchtest für jeden Zeitpunkt wissen, ob Du bei dem aktuellen Strompreis eine Einheit Strom kaufen oder verkaufen sollst, um insgesamt den Gewinn zu maximieren. Dabei soll zu jedem Zeitpunkt die Strommenge im Speicher eine Obergrenze nicht überschreiten. Die Strommenge im Speicher hängt natürlich davon ab, ob Stromeinheiten gekauft oder verkauft werden, also von x1(t) und x2(t).
Dieses Problem kann in Matlab modelliert und mit bintprog gelöst werden. Ich frage mich allerdings, ob die Strommengen, die gekauft oder verkauft werden, nicht auch variabel sein sollten. Dann hätte man ein ganz normales lineares Optimierungsproblem, das mit linprog gelöst werden könnte.
Wenn die Problemformulierung feststeht, helfe ich gern bei der Umsetzung.
Vielen Dank schonmal für die Information.
Ich werde dann mal etwas weiter ausholen müssen
Aufgabenstellung:
Ich habe die Strompreise der EEX(European Energy Exchange) der letzten, sagen wir mal 2 Jahre. Sowohl den Verkaufspreis, als auch den Einkaufspreis für Strom.
Nun soll ich mein Kraftwerk (Druckluftspeicherkraftwerk mit Gasturbine, sprich ich habe einen Speicher, in welchen in meinen eingekauften Strom in Form von Luft einspeichern kann) so optimieren, als wenn es die vergangenen 2 Jahre optimal, sprich gewinnmaximiert betrieben worden wäre. Die Strompreise liegen für jeweils alle 15 Minuten vor.
Nun geht es darum, den Gewinn unter gewissen Nebenbedingungen zu maximieren.
Speichergröße liegt zwischen 0 und vmax:
Die Leistungen sind höchstens = Pmax
und noch ein paar mehr, aber die würde ich dann schon selber hinbekommen. Es ist eher so, dass mir der Gesamtüberblick fehlt und ich erstmal einen Anstoß bräuchte.
Über eure Hilfe freue ich mich sehr. Super eine solche Plattform zu haben.
das sieht für mich jetzt schon sinnvoller aus. Mit den neuen Nebenbedingungen verstehe ich auch, warum man binäre Variablen braucht.
Allerdings sind die Speicherleistungen ja nicht binär. Und die neue Zielfunktion ist leider nicht mehr linear, da Terme wie "AusspeicherLeistung * x_verkaufen" vorkommen, also Optimierungsvariable miteinander multipliziert werden. Man hätte damit ein "Mixed Integer Nonlinear Problem", genannt MINLP. bintprog geht also für dieses Problem nicht mehr.
Ehrlich gesagt, gibt es keine Matlab-Funktion für Mixed-Integer-Probleme. Du hast nun ein paar Möglichkeiten.
1. Du benutzt eine Optimierungsfunktion aus dem Matlab File Exchange für nichtlineare Mixed Integer Programmierung, z.B. das hier oder das hier. Dabei müsstest Du keine Abstriche beim Problem stellen, hast aber keine gute Dokumentation und wir können auch nicht richtig helfen.
2. Du versuchst, das Problem umzuformulieren, sodass es entweder ohne binäre Variablen oder ohne Nichtlinearität/nichtbinäre Variablen auskommt. Dann könntest Du Standard-Matlab-Algorithmen verwenden.
3. Du verwendest nicht Matlab, sondern einen anderen Optimierungssolver, der standardmäßig auch nichtlineare Mixed-Integer-Probleme lösen kann.
Also Stand der Dinge ist, dass ich Matlab nutzen soll (soweit möglich), da mein Betreuer die Arbeit in seine mit einbauen möchte und er eben mit Matlab arbeitet.
Soweit ich das überblicken kann, sollte es mit einigen Vereinfachungen (Leistung ist konstant Pmax) möglich sein, das ganze auf ein Gemischt Ganzzahliges Problem runterzubrechen.
Ich würde mich damit nochmal genauer auseinander setzen und dann nochmal melden. Für einen konkreten Imlementierungsvorschlag wäre ich nämlich dann sehr sehr dankbar.
Ok wir können davon ausgehen, dass die Ein- / und Ausspeicherleistung konstant Pmax sind. Somit hätten wir ja jetzt ein MILP oder?
Könnte mir jetzt jemand dabei helfen das ganze erstmal zu implementieren?
Ich weis nämlich ehrlich gesagt nicht wie ich das angehen soll, vorallem da ich ja die Summe der Einzelentscheidungen optimieren soll und nicht einfach die Summe der Optimierten Einzelentscheidungen bilden kann.
ja, mir ist klar, was Du meinst.
Zum Glück ist es aber kein MILP, sondern ein reines binäres lineares Problem, wenn die Ein- und Ausspeicherleistung konstant Pmax sind.
Für die Implementierung musst Du zunächst die Preise einlesen. Ich gehe hier davon aus, dass sie in zwei Vektoren, p_e und p_v (für Einkaufs- und Verkaufspreise) vorliegen.
Code:
% Beispieldaten für 20 Zeitpunkte
p_e = 100*rand(1,20);
p_v = p_e - 10;
n = length(p_e); % Anzahl der Zeitschritte
Pmax = 10;
Dann muss klar sein, dass die Optimierungsvariablen x_e und x_v (für Einkauf und Verkauf) Vektoren sind, die genauso lang sind wie p_e und p_v.
Für die Zielfunktion multipliziert man jetzt den (Zeilen-)Vektor der Preise mit dem (Spalten-)Vektor der Entscheidungsvariablen (und der konstanten Leistung). Herauskommt eine skalare Zahl, die Summe über die gewählten Einkaufs- bzw. Verkaufspreise. Halt: Die Einkaufspreise müssen natürlich mit -1 multipliziert werden. Die Multiplikation mit dem Entscheidungsvariablenvektor macht Matlab von allein, wir müssen nur den Zeilenvektor der Koeffizienten angeben:
Alle Nebenbedingungen müssen in Matrixschreibweise gebracht werden. Also eine große Koeffizientenmatrix A und ein Ergebnisvektor b, sodass die Bedingungen in der Form A*x <= b vorliegen.
Code:
% x_v + x_e <= 1 für alle Zeitpunkte
A1 = [eye(n),eye(n)];
b1 = ones(n,1);
% x_v_t + x_k_t-1 <=1 und x_k_t + x_v_t-1 <=1
A2 = [eye(n-1),zeros(n-1,2),eye(n-1);
zeros(n-1,1),eye(n-1),eye(n-1),zeros(n-1,1)];
A = [A1;A2];
b = [b1;b2];
Was man dann sieht: Um den Gewinn zu maximieren, muss man tatsächlich immer verkaufen. Es fehlt jetzt noch die Begrenzung des Speichers, dass man also nicht mehr verkaufen kann, als man hat. Dafür fehlt mir aber noch etwas das Verständnis. Es gibt doch bestimmt einen initialen Speicherstand, V0 oder so. Wie ändert sich der, wenn zum ersten Zeitpunkt Strom eingekauft und mit Pmax eingespeichert wird? Und wie, bei einer Ausspeicherung? Ich hoffe mal, dass es sich um einen linearen Zusammenhang handelt.
Speicher zum Zeitpunkt T ist gleich Speicher zum vorigen Zeitpunkt * Selbstentladungskonstante + Wirkungsgrad beim Einspeichern * x_e * konstante Einspeicherleistung * Zeitdauer der Einspeicherung (delta T, in unserem Fall 15 minuten) - 1 geteilt durch Wirkungsgrad beim Ausspeichern * konstante Ausspeicherleistung * x_v * Zeitdauer der Ausspeicherung (delta T , ebenfalls 15 minuten).
Ich finde es sehr bemerkenswert wie selbstverständlich und nett mir hier geholfen wird, ich danke dir Bijick und allen die eventuell noch antworten werden ganz recht herzlich. Ohne eure Hilfe wäre ich wohl sehr aufgeschmissen.
schau Dir mal für eine kleine Anzahl Zeitschritte die bisherigen Nebenbedingungen an, ob Du damit was anfangen kannst. Die neue wird nämlich noch mal komplizierter. Es ist aber auf jeden Fall möglich, das aufzudröseln.
So, da bin ich wieder. Das war nicht leicht, und es könnte eventuell Probleme mit dem Speicherplatz geben, da die Matrizen riesig werden, und die Funktion toeplitz, die ich zum Basteln verwende, irgendwann streikt. Also probiere die Optimierung erstmal für kleine Anzahlen von Zeitschritten.
Erstmal definiere ich Konstanten für die Übersichtlichkeit:
Bei den nächsten Zeitschritten setzt sich das fort und es kommen immer höhere Exponenten für K1 vor. Wenn K1 also sehr groß oder sehr klein und n sehr groß ist, kommt nur noch Murks raus (0 oder Inf). Also hier aufpassen!
Die Konstruktion der Matrix geht jetzt am knappsten mit toeplitz und tril. Siehe dazu die Hilfe.
Danke dir, ich habe jetzt ja erstmal Ansätze und werde schauen in wie weit das überhaupt möglich ist mein Problem damit zu lösen, denn es gibt ja letztendlich noch mehr Nebenbedingungen.
Ich danke dir fürs erste und würde mich freuen bei meinem weiteren Vorgehen auf dich zurückgreifen zu dürfen.
Einkaufspreis = Verkaufspreis -> Es gibt in der Realität nur ein Preis zum kaufen und verkaufen. Das vereinfacht die ganze Sache und erklärt glaube ich auch, warum du keine sinnvollen Werte hattest. Bei dir waren die Einkaufspreise ja immer höher waren als die Verkaufspreise.
Wie auch immer mit folgendem Code bekomme ich erste Ergebnisse die schonmal nicht ganz falsch aussehen. Muss ich jetzt halt mal verifizieren und durchgehen.
Danke für die Hilfe bisher. Ich weis nicht ob ich da alleine drauf gekommen wäre.
Beste Grüße
Kai
Code:
% Variablen deklarieren
% Beispieldaten für 5 Zeitpunkte
p = 20*rand(1,4); % Preise
n = length(p); % Anzahl der Zeitschritte
Pmax = 1;
Du kannst Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen. Du kannst Dateien in diesem Forum posten Du kannst Dateien in diesem Forum herunterladen
MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.