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 - Bedingungen an Fitnessfunktion

 

student_2021
Forum-Newbie

Forum-Newbie


Beiträge: 9
Anmeldedatum: 26.01.21
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.02.2021, 17:03     Titel: GA Optimierung - Bedingungen an Fitnessfunktion
  Antworten mit Zitat      
Hallo,

ich hatte schon eine Frage zu meinem Problem gestellt, will es aber hier nochmal deutlicher formulieren.

Ich möchte eine Optimierung mittels ga durchführen. Das funktioniert auch alles soweit, jedoch sollen nun 2 Beschränkungen für die Fitnessfunktion gesetzt werden.

Mein Vektor für die 9 veränderlichen Variablen sieht folgendermaßen aus:

Code:

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


Für x0 habe ich jeweils obere und untere Grenze sowie lineare Abhängigkeiten mittels A und b formuliert (x0(1) < x0(2) etc). Im weiteren Verlauf des Funktionsskriptes werden mittels den variierten x0's verschiedene Größen berechnet, die in Matrizen "Geschwindigkeit" und "Weg" abgespeichert werden. Diese beiden Größen bilden dann auch meine Fitnessfunktion:

Code:

out = sum(Geschwindigkeit(:))+sum(Weg(:));
 


hier ist also kein x0 direkt mehr enthalten, sondern wurde vorher zum Erstellen von Geschwindigkeit und Weg verrechnet.
Nun möchte ich Bedingungen einführen, dass "Geschwindigkeit<20" und "Weg<10" sein soll.
Ich habe in meinen "variabel_Vektor" Geschwindigkeit und Weg mit aufgenommen,
Code:

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

A um "1-20" und "1-10" und b um zwei 0en ergänzt und die Anzahl der veränderlichen Variablen auf 11 erhöht, in der Hoffnung, dass ga so den beiden Größen in der Fitnessfunktion Beschränkungen zuordnen kann.
Code:

% lineare Beschränkungen

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


Leider klappt das nicht, direkt nach Aufrufen des Funktionsskriptes gibt es einen Fehler beim Definieren des "variabel_Vektor"...

Hat jemand eine Idee, wie ich meiner Fitnessfunktion die genannten Einschränkungen übermitteln kann? Ich bin für jeden Tipp dankbar!

Vielen Dank im Voraus :)
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 20.02.2021, 18:02     Titel:
  Antworten mit Zitat      
Hallo,

da du in dem anderen Beitrag keine Folgefrage mehr gestellt hast, bin ich davon ausgegangen, dass es keine Frage mehr dazu gibt.

Wenn du Unterstützung bei einer Fehlermeldung möchtest, kopiere bitte den Fehler anstatt ihn zu übersetzen und poste den zusammenhängenden Code. Falls die Fehlermeldung "undefined variable" ist, dürfte das an verschiedenen Workspaces liegen. Aus deinen Code-Schnipsel kann man aber nicht erahnen, was in welchem Workspace ist.

Wenn Geschwindigkeit und Weg linear von x0 abhängen, kannst du das als lineare Ungleichung angeben. Ansonsten bleibt nur der Weg über eine nichtlineare Ungleichung. Den Weg über zusätzliche Variablen halte ich nicht für sinnvoll, da so wohl kaum der Zusammenhang zu x0 erhalten bleibt.

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: 22.02.2021, 13:10     Titel:
  Antworten mit Zitat      
Hallo Harald,

dankeschön für deine Antwort.
Zu meinem ersten Beitrag hatte ich auch keine Folgefrage, hier meinte ich einen neuen Beitrag den ich vor ein paar Tagen geschrieben aber durch diesen konkretisierten Beitrag ersetzt habe.

Die Fehlermeldung lautete "not enough input arguments".
Das Problem mit den verschiedenen Workspaces habe ich mittels evalin und assign im Griff, das funktioniert soweit alles.

Ich habe auf dein Anraten hin mal in meinem Funktionsskript die Berechnungen für die Fitnessfunktion so aufgeschlüsselt, dass das x0 noch darin enthalten ist. Im Wesentlichen sieht der Code wie folgt aus:

Code:

function [out] = Optimierung(x0)

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

Schleife_1 = [4 3 2 1];
Schleife_2 = 1.0:-0.1:0.2; % length(1.0:-0.1:0.2) = 9, deshalb bis x0(9)


for S_1 = 1:length(Schleife_1)
   
    for S_2 = 1:length(Schleife_2)
       
        % hier folgen verschiedene Berechnungen usw.
        % [.........]
       
       
        if Abstand >= 0
           Weg(S_1,S_2) = s_T - [(s_T - x0(S_2) - l - d) + s_B];
       
        else Weg(S_1,S_2) = 0;
        end
       
       
        if Abstand < 0
           Geschwindigkeit(S_1,S_2) = sqrt(v0^2 - 2*mf*g*[s_T-(s_T-x0(S_2)-l-d)]);

        else Geschwindigkeit(S_1,S_2) = 0;
        end
       
       
    end
end


% Fitnessfunktion
out = sum(Geschwindigkeit(:))+sum(Weg(:));
 

Der Wert der Fitnessfunktion kann vermutlich weiterhin so berechnet werden, da GA ja in den vorigen Berechnungen die Einschränkungen durch das x0 verwerten kann. (?)
Alle sonst verwendeten Variablen wie v0,mf, ... liegen als Zahlenwert vor.

Die Bedingungen sehen dann wie folgt aus:
Code:

% Bedingung für Geschwindigkeit: jeweils <= 20:
% sqrt(v0^2 - 2*mf*g*[s_T-(s_T-x0(S_2)-l-d)]) - 20 <= 0

% Bedingung für Weg: jeweils <= 10:
% s_T - [(s_T - x0(S_2) - l - d) + s_B] - 10 <= 0
 

Ich erhalte also mit dem Wurzelterm eine nichtlineare Ungleichung und für den Weg eine lineare Ungleichung. Und da sich das x0 ja immer auf den Index aus dem jeweiligen Schleifendurchlauf bezieht, kann ich auch keine "festen" Beziehungen, wie bereits in Matrix A enthalten, angeben... hier bin ich etwas ratlos.
Gibt es einen Weg, wie sich diese beiden Bedingungen an GA übergeben lassen?

Vielen Dank im Voraus für die Mühe!

Grüße
Daniel
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: 26.02.2021, 22:54     Titel:
  Antworten mit Zitat      
ich habe noch eine Folgefrage hierzu: beim Aufstellen der linearen Bedingungen ergeben sich die Matrix A und Vektor b.
Die 9 unteren Einträge von A sind jeweils den 9 unteren Einträgen in Vektor b zugeordnet.
Die 9 unteren Einträge in b hängen als Zahlenwert aber von dem Parameter des Schleifendurchlaufes ab, siehe folgenden Code:

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;
      1 0 0 0 0 0 0 0 0;
      0 1 0 0 0 0 0 0 0;
      0 0 1 0 0 0 0 0 0;
      0 0 0 1 0 0 0 0 0;
      0 0 0 0 1 0 0 0 0;
      0 0 0 0 0 1 0 0 0;
      0 0 0 0 0 0 1 0 0;
      0 0 0 0 0 0 0 1 0;
      0 0 0 0 0 0 0 0 1;];
 

for S_1 = 1:length(Schleife_1)
 
    b(S_1) = [0;
              0;
              0;
              0;
              0;
              0;
              0;
              0;
              10 - l - d + (v0^2)/(2*(Schleife_1(S_1)*9.81));
              10 - l - d + (v0^2)/(2*(Schleife_1(S_1)*9.81));
              10 - l - d + (v0^2)/(2*(Schleife_1(S_1)*9.81));
              10 - l - d + (v0^2)/(2*(Schleife_1(S_1)*9.81));
              10 - l - d + (v0^2)/(2*(Schleife_1(S_1)*9.81));
              10 - l - d + (v0^2)/(2*(Schleife_1(S_1)*9.81));
              10 - l - d + (v0^2)/(2*(Schleife_1(S_1)*9.81));
              10 - l - d + (v0^2)/(2*(Schleife_1(S_1)*9.81));
              10 - l - d + (v0^2)/(2*(Schleife_1(S_1)*9.81));];
           
end

 


wenn ich die for-Schleife für b so im Command Window ausführe, bekomme ich b als "1x4 cell", siehe auch Anhang. Ist es dem genetischen Algorithmus so möglich, die linearen Randbedingungen zu verwenden und für die Berechnung der Fitnessfunkltion dies den Schleifendurchläufen S_1 zuzuordnen?

Wenn ich jedoch den Genetischen Algorithmus ausführen möchte, wird folgender Fehler ausgegeben:
Code:

Cell contents assignment to a non-cell array object.

Error in Skript_Optimierung (line 188)
    b{S_1} = [0;
 


wo liegt hier der Fehler? Etwas scheint evtl mit den Datenformaten nicht zu passen?

b.mat
 Beschreibung:

Download
 Dateiname:  b.mat
 Dateigröße:  242 Bytes
 Heruntergeladen:  202 mal
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.