Verfasst am: 26.01.2021, 22:58
Titel: GA Optimierung - untere Grenze in Abhängigkeit v. Parameter
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 = [150150150150150150150150150]; % 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
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 ;)
vielen Dank für deine Antwort! 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-10000000;
01-1000000;
001-100000;
0001-10000;
00001-1000;
000001-100;
0000001-10;
00000001-1;];
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:
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:
also ganz andere Wertebereiche und viel unterschiedlicher. Ist hier noch irgendetwas faul oder geht GA aufgrund der Beschränkungen die Sache etwas "langsamer" an?
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 ;)
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
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.