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

gamultiobj Paretofront

 

ChriX
Forum-Anfänger

Forum-Anfänger


Beiträge: 11
Anmeldedatum: 12.02.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.02.2012, 12:03     Titel: gamultiobj Paretofront
  Antworten mit Zitat      
Hallo Leute,

ich bin dabei ein Problem mit 2 Optimierungskriterienüber den gamultiobj lösen zu lassen.
Hierbei gibt es ja jetzt eine Einstellung in den Optionen, dass ich mir die Paretofront anzeigen lassen kann. Das habe ich mit " 'PlotFcn',@gaplotpareto " gemacht.
Allerdings würde ich gerne einen Großteil oder alle Ergebnisse anzeigen lassen da ich wissen muss, ob meine Ziele korrelieren oder gegeneinander arbeiten.
Bisher wird mir ja nur die tatsächliche Front angezeigt.
Ich habe schon eine ganze weile in der Hilfe geblättert, aber keine Antwort gefunden.
Ich hoffe ihr könnt mir helfen,

Lg
Chrix
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.502
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 12.02.2012, 20:09     Titel:
  Antworten mit Zitat      
Hallo,

du kannst mit anderen plotfcn arbeiten oder auch selbst eine custom plotfcn erstellen.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
ChriX
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 11
Anmeldedatum: 12.02.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.02.2012, 12:58     Titel:
  Antworten mit Zitat      
Also ich habe glaube ich alle Plotfcns mittlerweile getestet, aber keine davon zeigt mir einfach nur alle Punkte an, die während der Optimierung gefunden werden.
Und wie ich so eine Funktion selbst schreiben kann, bin ich ehrlich gesagt ratlos, habe mir die Hilfe dazu zwar durchgelesen, aber...

Lg Chrix
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 16.02.2012, 18:43     Titel:
  Antworten mit Zitat      
Hallo hast schon SCATTER probiert?
Private Nachricht senden Benutzer-Profile anzeigen
 
ChriX
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 11
Anmeldedatum: 12.02.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.02.2012, 17:03     Titel:
  Antworten mit Zitat      
ah hat ein wenig gedauert.
Danke für den Hinweis.
Auch wenn euch das nicht gefallen wird habe ich es über eine globale Variable gelöst.
Diese wird vor dem gamultiobj() Aufruf erzeugt und in der Gütefunktion wird über
EP_fb = [EP_fb; obj] der Funktionswert der Optimierung immer an die vorhandenen Angehängt.
So kann ich danach den Plot manuell erzeugen, was auch von Vorteil ist da bei mir zwei verschiedene Optimierungen nacheinander laufen und ich so beide Kriterienräume plotten kann.
Mit dem PlotFctn wurde die erste Pareto-Front ja immer überschrieben.

Vielen Dank
Private Nachricht senden Benutzer-Profile anzeigen
 
ChriX
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 11
Anmeldedatum: 12.02.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.02.2012, 17:56     Titel:
  Antworten mit Zitat      
Jetzt habe ich allerdings ein neues Problem.

Code:

function [ obj ] = optimierung_laplace( Var,P,An,psip_start,Psip_max,ay0,obj_ref )

global EP_fb;
D_opt = LSM_opt(Var,An,psip_start);
lin_psip = linspace(psip_start,Psip_max,length(An.f_win))';
dif_psip = D_opt.G_PsipDelta_R-lin_psip;
dif_ay = D_opt.G_AyDelta_R-ay0;

eps = 0.05;
 nb = max(D_opt.G_PsipDelta_R)>(1+eps)*Psip_max;
 delta_max= max(D_opt.G_PsipDelta_R)-Psip_max;
% obj(1)= trapz(abs(dif_psip)); %psip im frequeznbereich ansteigender gerade folge
        if nb
            obj(1) = trapz(abs(dif_psip))/obj_ref(1)+1+delta_max*100;
            obj(2)= trapz(abs(dif_ay))/obj_ref(2)+1+delta_max*100; %ay soll const im FB sein
        else
            obj(1) = trapz(abs(dif_psip))/obj_ref(1);
            obj(2)= trapz(abs(dif_ay))/obj_ref(2); %ay soll const im FB sein
        end
EP_fb = [EP_fb;obj];

end

So sieht die Funktion aus, die mein problem optimieren soll. Soweit funktioniert auch die Sammlung der Entwurfspunkte.
Benutze ich allerdings die Parraleltoolbox, also z.B.
Code:
matlabpool open 6
funktioniert es nicht mehr.
Da ein Optimierungsdurchgang schon rellativ lange dauert bin ich eig. auf die Multicore-Anwendung angewiesen.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

bei dieser Problemformulierung kann man leider nicht helfen.

1. Was funktioniert nicht? Welche Fehlermeldungen gibt es?
2. Wie parallelisierst du überhaupt?

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
ChriX
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 11
Anmeldedatum: 12.02.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.02.2012, 19:58     Titel:
  Antworten mit Zitat      
Code:

options2=gaoptimset('Display','iter','TolCon',1e-6,'TolFun',1e-6,'Generations',20,...
                    'UseParallel','always', 'Vectorized', 'off','PlotFcn',@gaplotpareto,...
                    'PopulationSize',50);
[Var_opt_n,FVAL_n,~,~,~,SCORE_n] = gamultiobj(@(Var) optimierung_numerisch(Var,P,An,psip_start,psip_max,ay0,obj_n),l,a,b,[],[],lb,ub,options2);


So läuft die Optimierung ab.
In den Optionen habe ich 'UseParallel','always' eingestellt, womit eine von mir vorgegebene anzahl an kernen ( matlabpool open x) verwendet wird.

in der globalen Variable soll jedes Ergebnis obj=optimierung_numerisch(...) gespeichert werden. Wenn ich keinen matlabpool geöffnet habe funktioniert das auch, ich erhalte eine Matrix EP_fb(...,2) mit vielen >Zeilen, abhängig von Population und Generationen.
Öffne ich einen Pool mit mehreren Kernen "matlabpool open 6" erhalte ich danach nur eine Zeile, statt mehreren 100.

Hoffentlich hab ich mich diesmal verständlicher ausgedrückt
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

wie du selbst sagst, sollte man nach Möglichkeit keine globalen Variablen verwenden. Im Zusammenhang mit Parallel Computing schon gar nicht.

"Global and Persistent Variables
The body of a parfor-loop cannot contain global or persistent variable declarations."
http://www.mathworks.com/help/toolbox/distcomp/bq__cs7-1.html

http://www.mathworks.com/matlabcent.....reader/view_thread/267336

Google liefert noch weitere Treffer.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
ChriX
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 11
Anmeldedatum: 12.02.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.02.2012, 22:15     Titel:
  Antworten mit Zitat      
Da ich keine möglichkeit sehe die Werte außer mit einer globalen Variable, aus dem Optimierungsprozess zu bekommen, wollte ich bei jedem aufruf eine Datei einlesen, und am Ende den eingelesenen Wert + das neue Ergebnis wieder in die Datei schreiben.

Code:

EP_fb = [1,1];
dlmwrite('EP_fb.csv',EP_fb,';');
[Var_opt_l,FVAL_l,~,~,~,SCORE_l] = gamultiobj(@(Var) optimierung_laplace(Var,P,An,psip_start,psip_max,ay0,obj_l),l,a,b,[],[],lb,ub,options);

function [ obj ] = optimierung_laplace( Var,P,An,psip_start,Psip_max,ay0,obj_ref )
EP_fb = dlmread('EP_fb.csv',';');
%
%hier  wird obj()=... berechnet
%
EP_fb = [EP_fb;obj];
dlmwrite('EP_fb.csv',EP_fb,';');
 

Bevor der ga ausgeführt wird erzeuge ich die Datei mit einem Eintrag, damit ich beim ersten Einlesen keinen Fehler bekomme.

führe ich
Code:
obj_l = optimierung_laplace(Var,P,An,psip_start,psip_max,ay0,[1,1]);
EP_fb=dlmread('EP_fb.csv',';');

aus steigt bei jedem Durchgang die Zeilenzahl von EP_fb um 1

bei paralleler Optimierung
Code:
[Var_opt_l,FVAL_l,~,~,~,SCORE_l] = gamultiobj(@(Var) optimierung_laplace(Var,P,An,psip_start,psip_max,ay0,obj_l),l,a,b,[],[],lb,ub,options);
 

hingegen kommt folgender Fehler:
Code:
??? Error using ==> parallel_function at
598
Error in ==> dlmread at 145
Badly formed format string.

Error in ==> fcnvectorizer at 17
        parfor (i = 1:popSize)

Error in ==> gamultiobjMakeState at 116
    nextScore =
    fcnvectorizer(nextPopulation,FitnessFcn,numObj,options.SerialUserFcn);
   
Error in ==> gamultiobjsolve at 11
state =
gamultiobjMakeState(GenomeLength,FitnessFcn,output.problemtype,options);

Error in ==> gamultiobj at 240
[x,fval,exitFlag,output,population,scores]
= gamultiobjsolve(FitnessFcn,nvars, ...

Caused by:
    Failure in user-supplied fitness
    function evaluation. GA cannot
    continue.

Das bedeutet ja eigentlich, dass in der Datei keine Werte enthalten sind oder? Öffne ich danach die EP_fb.csv sind elemente enthalten, diesmal z.B 51 Zeilen.

edit: der Fehler kommt immer zu unterschiedlichen Zeiten, mal ist nichtmal die Erste Generation berechnet, ein anderes mal tritt der Fehler erst bei Generation 4 auf...
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 - 2025 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.