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

GA Optimierung - untere Grenze in Abhängigkeit v. Parameter

 

student_2021
Forum-Newbie

Forum-Newbie


Beiträge: 9
Anmeldedatum: 26.01.21
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 26.01.2021, 22:58     Titel: GA Optimierung - untere Grenze in Abhängigkeit v. Parameter
  Antworten mit Zitat      
Hallo,

ich habe ein Skript geschrieben, zu dessen Ende hin die Optimierung mit GA initialisiert und dann die Optimierungsfunktion vom GA aufgerufen wird.
Die Grenzen für die 9 Parameter habe ich alle von 0 bis 150 festgelegt. In der Funktion wird ein Vektor x0 mit x0(1) x0(2) ..... x0(9) definiert. GA erstellt hieraus eine zufällige Startverteilung, die mit jedem Durchlauf verändert wird.
Nach Abschluss der Optimierung sieht das Ergebnis beispielsweise so aus: [1.9 0 0.2 0.9 4.6 2.1 0 0 1.4]
Damit das Ergebnis jedoch einen Sinn ergibt, müssen die Einträge nach der Größe aufsteigend geordnet sein, und das von Beginn an. Es müssen also Bedingungen übergeben werden, dass x0(1) < x0(2) < x0(3) ..... < x0(9).

Meine Idee hierzu ist, die untere Grenze durch das jeweilige x0() zu ersetzen, jedoch scheint das nicht zu funktionieren, da x0 erst im Funktionsskript durch Einführung des Vektors bekannt wird.

Untere Grenze soll also sein:
0 - 150
x0(1) - 150
x0(2) - 150
....

Code:
% Skript

% bounds - 9 Parameter - obere und untere Grenze

% lb = [0 0 0 0 0 0 0 0 0]; % untere Grenze

lb = [0 x0(1) x0(2) x0(3) x0(4) x0(5) x0(6) x0(7) x0(8)]; % untere Grenze
ub = [150 150 150 150 150 150 150 150 150]; % obere Grenze

% Optionen
numvar = 9; % Anzahl Parameter
generations = 1;
popsize = 1; % The default is '50 when numberOfVariables <= 5, else 200'.
range = [lb;ub];
funtol = 1e0; % FunctionTolerance

% Optionen
optionsga = gaoptimset('Generations',generations,'PopulationSize',popsize,...
    'PopInitRange',range,'TolFun',funtol,'Display','iter','UseParallel',0);

% Optimierung
[xout,fval,exitflag,output] = ga(@Optimierung,numvar,[],[],[],[],lb,ub,[],optionsga);

 



Code:
% Funktion

function [out] = Optimierung(x0)

Vektor = [x0(1) x0(2) x0(3) x0(4) x0(5) x0(6) x0(7) x0(8) x0(9)];

.....


 



Hat jemand eine Idee, wie dies umzusetzen ist?
Wenn ich das Skript so ausführe, erhalte ich als Fehlermeldung:

Code:

Undefined function or variable 'x0'.

Error in Skript_Optimierung(line 154)
lb = [0 x0(1) x0(2) x0(3) x0(4) x0(5) x0(6) x0(7) x0(8)]; % untere Grenze
 


Vielen Dank schon einmal im Voraus!
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


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

für mich wären zwei Ansätze sinnvoll:

a) die Bedingung als lineare Ungleichung umsetzen:
x1 - x2 <= 0
x2 - x3 <= 0
...
in Matrix-Vektor-Form:
A * x <= zeros(10, 1) mit
Code:
A = [1 1 0 ..... 0;
    0 1 1 0 ..... 0;
    0 0 1 1 0 .....0
    ... ];


b) statt x(2) bis x(10) die Unterschiede dx zum jeweils vorherigen Wert betrachten:
dx(k) >= 0 für alle k
x(1) + sum(dx) <= 150 als lineare Ungleichung

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
 
student_2021
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 9
Anmeldedatum: 26.01.21
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.01.2021, 14:15     Titel:
  Antworten mit Zitat      
Hallo,

vielen Dank für deine Antwort! Smile tatsächlich habe ich das Problem inzwischen so gelöst, wie du es unter Möglichkeit 1 beschreibst.
Beim Aufstellen der Matrix A aus den Ungleichungen ist die zweite 1 jedoch immer negativ, da ja "-x0()". Oder täusche ich mich? Sieht bei mir wie folgt aus:

Code:

% lineare Beschränkungen

A = [1 -1 0 0 0 0 0 0 0;
     0 1 -1 0 0 0 0 0 0;
     0 0 1 -1 0 0 0 0 0;
     0 0 0 1 -1 0 0 0 0;
     0 0 0 0 1 -1 0 0 0;
     0 0 0 0 0 1 -1 0 0;
     0 0 0 0 0 0 1 -1 0;
     0 0 0 0 0 0 0 1 -1;];
 
 b = [0;0;0;0;0;0;0;0];
 


GA führt für die Optimierungen sehr oft ein großes Simulink-Modell aus, die Berechnungen dauern wirklich lange. Nun habe ich (wenn man obere und untere Grenze jeweils 0 bis 150 beachtet) als Lösung nur sehr kleine Werte erhalten, die sich meist auch sehr ähnlich sind:

0,511090568332035 0,511132991293806 0,903003360373784 0,903017502753617 0,903045784371904 0,903045788244100 0,903059928841419 0,903088212361965 0,903088212361965

Die Optimierung lief mit nvar=9, popsize = 9 und generations = 1, um Zeit zu sparen. Wenn ich unter gleichen Bedingungen OHNE lineare Ungleichungen also ohne Einbeziehung von "A" und "b" die Optimierung durchführe, komme ich auf folgende Ergebnisse:

106,225239995660 54,0507714410877 62,6156867965957 91,0383826362298 52,0423486206669 88,8795247489140 90,5366860637048 32,2718583635738 19,3222514444148

also ganz andere Wertebereiche und viel unterschiedlicher. Ist hier noch irgendetwas faul oder geht GA aufgrund der Beschränkungen die Sache etwas "langsamer" an?

Vielen Dank im Voraus für die Bemühungen!
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

Zitat:
tatsächlich habe ich das Problem inzwischen so gelöst, wie du es unter Möglichkeit 1 beschreibst.

Wenn du ein Problem gelöst hast, poste das bitte. Ist ja doof, wenn man Zeit mit einem bereits gelösten Problem verbringt.

Zitat:
Beim Aufstellen der Matrix A aus den Ungleichungen ist die zweite 1 jedoch immer negativ, da ja "-x0()"

Ja, sorry dafür.

Ich würde die Frage stellen, ob GA hier das geeignete Tool ist, siehe
https://www.mathworks.com/help/gads.....or-choosing-a-solver.html
https://www.mathworks.com/help/gads.....osing-another-solver.html
Auch das kann nützlich sein:
https://www.mathworks.com/help/opti.....ifferential-equation.html

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
 
student_2021
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 9
Anmeldedatum: 26.01.21
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.01.2021, 15:42     Titel:
  Antworten mit Zitat      
Hallo,

das stimmt, tut mir leid, nächstes Mal werde ich gleich dazuschreiben, wenn und wie ich bei der Fragestellung evtl weitergekommen bin.

GA ist Vorgabe, aber danke für die Links, sehe ich mir mal genauer an!

Grüße
Daniel
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.