WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

classdef und Reinforcement Learning

 

FelixW
Forum-Anfänger

Forum-Anfänger


Beiträge: 33
Anmeldedatum: 19.08.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.02.2022, 09:47     Titel: classdef und Reinforcement Learning
  Antworten mit Zitat      
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)

Viele Grüße
Felix

Datenbasis.mat
 Beschreibung:

Download
 Dateiname:  Datenbasis.mat
 Dateigröße:  419.73 KB
 Heruntergeladen:  209 mal
EnvironmentBasis_080222.m
 Beschreibung:

Download
 Dateiname:  EnvironmentBasis_080222.m
 Dateigröße:  26.78 KB
 Heruntergeladen:  216 mal
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.495
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 10.02.2022, 12:19     Titel:
  Antworten mit Zitat      
Hallo,

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 ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
FelixW
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 33
Anmeldedatum: 19.08.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.02.2022, 13:31     Titel:
  Antworten mit Zitat      
Hallo Harald,

danke für die schnelle Antwort.
Zunächst kurz zu der "t+1" Problematik. Du hast die Zeilen korrekt identifiziert:

Code:
timestep = this.State(4)+1;

            Observation = [load_PV_obs; batt_obs;Price_Compense_obs;timestep];
            % Update system states
            this.State = Observation;


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?

Viele Grüße

validation_Test.mlx
 Beschreibung:

Download
 Dateiname:  validation_Test.mlx
 Dateigröße:  3.47 KB
 Heruntergeladen:  185 mal
EnvironmentBasis_100222.m
 Beschreibung:

Download
 Dateiname:  EnvironmentBasis_100222.m
 Dateigröße:  26.85 KB
 Heruntergeladen:  197 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.495
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 10.02.2022, 15:00     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
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.


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 ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
FelixW
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 33
Anmeldedatum: 19.08.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.02.2022, 09:56     Titel:
  Antworten mit Zitat      
Guten Morgen,

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

Download
 Dateiname:  EnvironmentBasis.m
 Dateigröße:  22.25 KB
 Heruntergeladen:  193 mal
ENV_debugging.mlx
 Beschreibung:
Die extrahierte Datei zum Debuggen. In meinm ersten Post zu diesem Thema findet ihr die Datei Datenbasis die zu Beginn geladen wird

Download
 Dateiname:  ENV_debugging.mlx
 Dateigröße:  6.05 KB
 Heruntergeladen:  192 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.495
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 11.02.2022, 11:17     Titel:
  Antworten mit Zitat      
Hallo Felix,

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 ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
FelixW
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 33
Anmeldedatum: 19.08.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 14.02.2022, 09:03     Titel:
  Antworten mit Zitat      
Hallo Harald,

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


Im Anhang meine aktuelle Version und das Beispiel für ein Reinforcement Leartning Environment auf welchem ich aufbaue.

Viele Grüße

Felix

Pruefenvironment.m
 Beschreibung:
Matlab Beispiel

Download
 Dateiname:  Pruefenvironment.m
 Dateigröße:  8.36 KB
 Heruntergeladen:  186 mal
EnvironmentBasis.m
 Beschreibung:
Mein Script

Download
 Dateiname:  EnvironmentBasis.m
 Dateigröße:  17.21 KB
 Heruntergeladen:  175 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.495
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 14.02.2022, 10:52     Titel:
  Antworten mit Zitat      
Hallo,

mir ist nicht klar, was die Frage ist.

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 ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

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
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2024 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

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.