Verfasst am: 10.02.2022, 09:47
Titel: classdef und Reinforcement Learning
Hallo
ich habe ein Problem bei der Erstellung eines Reinforcement Learning environments, stelle die Frage aber an dieser Stelle (erneut und erweitert) weil es in teilen auch eher eine Fragestellung zu classdef ist.
Teil 1 (wohl eher classdef):
Ich muss neben Konstanten auch Arrays definieren (ursprüngliche eine Tabelle mit 3 Variablen und 8760 Zeilen). Zu Testzwecken habe ich starkt gekürzte Arrays (Zeile 38,39 und 42) mit je nur 4 Einträgen "händisch" eingefügt. Gibt es hier eine vernünftige Variante? Der "klassische" Zugriff auf Variablen aus dem Workspace ist ja nicht möglich. Die Quelle für die Arrays befindet sich in der Datei Datenbasis, Tabelle Zeitreihe.
Teil 2 (vielleicht eher Reinforcement Learning)
Es gibt den index "t" Zeile 85. Default Wert für this.state(4) ist 1. Am Ende der step Funktion soll der Wert um 1 erhöht werden. So dass dieser zu beginn der 2 Episode this.State(4) = 2 ist usw.
Wenn ich mit dem Environment einen Agent trainiere bleibt das environment aber augenscheinlich auf timestep 1 "hängen"
für den reduzierten Fall kann ich die maximal zu erreichenden Rewards je step und Episode gut "manuell" berechnen. Der Reward je Episode entspricht exakt dem Wert für den ersten Timestep (4 Nachkomma Stellen)
vorweg: ich kenne mich nicht mit Reinforcement Learning aus.
Teil 1: du kannst Eigenschaften auch im Konstruktor oder vom Command Window aus setzen mit obj.Prop = ...
Ich würde hier eine Einarbeitung in die Objektorientierung empfehlen. Klassen verwenden ist sonst schwierig.
Teil 2:
Zitat:
Am Ende der step Funktion soll der Wert um 1 erhöht werden.
Wo soll das passieren? In Zeilen 485-489?
Das sieht an sich sinnvoll aus. Ich kann hier nur debuggen empfehlen:
1. Ist State nach Zeile 489 wie gewünscht?
2. Falls ja, wo wird er zurückgesetzt?
Falls das nicht weiterhilft, würde ich eine Kontaktaufnahme mit dem Technischen Support von MathWorks empfehlen.
Grüße,
Harald
_________________
1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Ich muss das Array "doppelt" ablegen. Observation ist das Array, welches in der RL Syntax an den Agent übergeben wird. Input für die Funktion (im folgenden Durchlauf) ist jedoch this.State
Vielleicht ist eine Anpassung dieser form übersichtilicher:
Nicht wundern. Der timestep muss nicht an den Agent übergeben werden, habe die Gelegenheit genutzt und es so angepasst das State ein 1x4 Array mit dem Timestep als letzem Eintrag ist und die Observation ein 1x3 Array
Code:
this.State(4) = this.State(4)+1;
% Erzeuge das Observation Array
Observation = [load_PV_obs; batt_obs;Price_Compense_obs];
% Update system states
this.State = [Observation this.State(4)];
Zurückgesetzt wird auf InitialObservations mit der reset function (ab Zeile 499) der Aufruf erfolgt durch train(env,agent) wenn der Reinforcement Agent trainiert wird.
Ein Problem könnte die IsDone Flag sein, diese sollte eigentlich mit dem Erreichen des 4 Timesteps aus True springen und damit die Episode beenden, hier wäre eine denkbare Fehlerquelle.
(leider hab ich im neuen Script ein anderes Problem, für die hier diskutierte Fragestellung sollte es aber gehen)
Mit den wenigen Codezeilen in validation_Test lässt sich das Environment prüfen
Zu dem Punkt mit der integration der Arrays:
Mein objekt (obj) ist damit die class (EnvironmentBasis_100222). Kannst due mir einen Tipp geben wo ich die exakte Syntax nachvollziehen kann, um auf diesem Weg der Class das Array zuzuweisen?
Zurückgesetzt wird auf InitialObservations mit der reset function (ab Zeile 499) der Aufruf erfolgt durch train(env,agent) wenn der Reinforcement Agent trainiert wird.
Ein Problem könnte die IsDone Flag sein, diese sollte eigentlich mit dem Erreichen des 4 Timesteps aus True springen und damit die Episode beenden, hier wäre eine denkbare Fehlerquelle.
(leider hab ich im neuen Script ein anderes Problem, für die hier diskutierte Fragestellung sollte es aber gehen)
... und nun? Ich kann dir nur nochmal Debugging empfehlen.
Zitat:
Mit den wenigen Codezeilen in validation_Test lässt sich das Environment prüfen
Die erste Zeile davon ist nicht sinnvoll. Variablen nie wie Funktionen und Klassen benennen! Erst recht nicht so, wie die Funktion oder Klasse an sich!
Zitat:
Mein objekt (obj) ist damit die class (EnvironmentBasis_100222).
Bitte arbeite dich in OOP ein. Objekt und Klasse sind zwei unterschiedliche Dinge.
Sinnvoll ist z.B.:
Code:
eb = EnvironmentBasis_100222;
eb.Load_time = ...% Hier kannst du die Load_time setzen
eb.Price_time = ...% Hier kannst du die Price_time setzen % etc.
1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Mein "Array Problem" hätte ich gelöst. Vielen Dank dafür!!
Leider das t+1 Problem nicht.
Ich habe den Funktionsblock kopiert und in einem normalen Live-Script als Schleife realisiert. Hier gibt es keinen Bug und der index läuft ganz normal durch...
Den Support habe ich kontaktiert...
Fals doch jemandem eine Idee kommt, ich bin offen....
EnvironmentBasis.m
Beschreibung:
Das Reinforcement Environment das nicht läuft, bzw. bei dem der index nicht gezählt wird
kannst du mir bitte (gerne per PN) die Case Number für den Technischen Support schicken? Dann kann ich dabei helfen, den Kreis zu schließen.
Danke und Grüße,
Harald
_________________
1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Danke dir für das Angebot. Die Probleme habe ich aber jetzt gelöst. Jetzt habe ich aber ein neues. Ich habe in meinem Code "Help Functions" (der Terminus stammt aus dem Matlab internen Beispiel) angelegt.
Die Funktionen function_load_PV und getReward werden nicht als Funktionen definiert.
Ich erkenne aber beim besten Willen keinen Unterschied in der verwendeten Syntax...
Code:
%% Lastdeckung durch PV function[Load_sys, left_gen] = function_load_PV(Load_sys, left_gen) % PV_Load = min(Load_sys,left_gen);
Load_sys = max([Load_sys-min(Load_sys,left_gen)0]);
left_gen = max(left_gen-Load_sys,0);
end % Lastdeckung durch Batterie function[Load_sys, Batt_stor, Batt_out] = function_load_batt(this, Load_sys, Batt_stor)
Batt_out = min([this.Batt_P Batt_stor Load_sys]);
Batt_stor = Batt_stor - Batt_out;
Load_sys = load_PV - Batt_out;
end % Beladen der Batterie mit PV-Strom function[left_gen, Batt_stor, Batt_in] = function_charge_PV(this, left_gen, Batt_stor)
temp1 = Batt_stor+(left_gen*this.eta);
temp2 = Batt_stor+this.Batt_P;
temp3 = left_gen*this.eta;
temp4 = this.Batt_cap-Batt_stor;
Batt_in = min([temp3 this.Batt_P temp4]);
Batt_stor = min([this.Batt_cap temp1 temp2]);
left_gen = left_gen-(Batt_in/this.eta);
end % Beladen der Batterie aus dem Netz function[Batt_stor, Grid_to_Batt] = function_charge_Grid(this, Batt_stor, Batt_out, Batt_in)
temp1 = this.Batt_P-Batt_out-Batt_in;
temp2 = this.Batt_cap - Batt_stor;
Grid_to_Batt = min([temp1 temp2]);
Batt_stor = Batt_stor+(this.eta*Grid_to_Batt);
end % Endladen der Batterie ins Netz function[Batt_stor, Batt_to_Grid] = function_decharge_Grid(this, Batt_stor)
temp1 = this.Batt_P-Batt_in;
temp2 = this.Batt_cap - Batt_stor;
Batt_to_Grid = min([temp1 temp2]);
Batt_stor = Batt_stor+(this.eta*Batt_grid);
end
%% Reward function function Reward = getReward(Batt_in,Batt_out,Grid_Load,Grid_to_Batt,Batt_to_Grid,PV_to_Grid,Price,Compense)
Reward = (Batt_in+Grid_Load+Grid_to_Batt)*Price + (Batt_out+Batt_to_Grid+PV_to_Grid)*Compense;
end
Ein Problem in deinem Code ist, dass Methoden als erstes Argument immer ein Objekt erwarten (im Beispiel "this" genannt). Wenn das nicht der Fall ist, muss man die Methode als Static deklarieren. Auch hier wieder die Empfehlung, sich grundlegende Kenntnisse zu objektorientierter Programmierung anzueignen.
Grüße,
Harald
_________________
1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Einstellungen und Berechtigungen
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.