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

Optimierung mit Hilfe von Genetischem Algorithmus

 

Andi1218

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 27.11.2013, 20:04     Titel: Optimierung mit Hilfe von Genetischem Algorithmus
  Antworten mit Zitat      
Hallo,

ich habe versucht eine Funktion mit Hilfe eines genetischen Algorithmus zu optimieren, hab den aber noch nie benutzt und komm einfach nicht drauf, wo mein Fehler liegt.

Hier mein Code:

Code:
for t=1:1:13

y=(z(t+1)-z(t))                                                
   
if y>32    

Q=z(t+1)
V=z(t)
   
 x1=1
 x2=1
   
 fun= @(x) Preise(x1+V)+Preise(x2+V)
   
[ x,fval] = ga(fun,2,[-1 1; 1 0; 0 1],[16; 16; Q-V],[],[],[0; Q-V-16],[16; Q-V])

end
end




Im Vektor "z" stehen bestimmte Stellen aus dem Vektor "Preise".


Der Algorithmus soll mir nun die zwei tiefsten "Preise" in einem bestimmten Bereich, welcher von V und Q begrenzt wird liefern, wobei die Bedingung erfüllt sein muss, dass

zwischen der unteren Grenze V und dem 1. Wert
dem 1. Wert und dem 2. Wert
dem 2. Wert und der oberen Grenze Q

jeweils nicht mehr als 16 stellen ausgelassen werden dürfen.



Ich bin mir aber auch nicht sicher, ob die Nebenbedingung so richtig angegeben ist, da meine Nebenbedingung ja "A*x<=b" heißen soll, wobei
A=[-1 1; 1 0; 0 1] und
b=[16; 16; Q-V]

ich hoffe, ihr Versteht, was ich vor hab und könnt mir vielleicht bisschen weiterhelfen. Danke schonmal!

Liebe Grüße,
Andi


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 27.11.2013, 23:39     Titel:
  Antworten mit Zitat      
Hallo,

woraus schließt du denn, dass es einen Fehler gibt?

Was bedeutet es, dass "nicht mehr als 16 stellen ausgelassen werden dürfen"?

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

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.12.2013, 17:44     Titel:
  Antworten mit Zitat      
Hey,

Zitat:
woraus schließt du denn, dass es einen Fehler gibt?


dass es einen Fehler gibt schließe ich daraus, dass er mir nicht die 2 tiefsten Preise unter berücksichtigung meiner Bedingungen ausgiebt, sondern x1=2 und x2=18, wobei z.b. x1=3 und x2=18 niedrigere Preise ergeben würde , d.h. Preise(3)+Preise(1Cool<Preise(2)+Preise(1Cool


Zitat:
Was bedeutet es, dass "nicht mehr als 16 stellen ausgelassen werden dürfen"?


Ich hab das wahrschinlich nicht verständlich genug ausgeführt.
z(t) und z(t+1) beschreiben zwei Stellen eines anderen Vektors, zwischen welchen in diesem nur nullen eingetragen sind, d.h. von Stelle z(t) bis z(t+1) ist etwas ausgeschaltet(=0). Wenn dieser Berech zu groß ist (y>32), muss dieses etwas 2 mal eingeschaltet werden, d.h. es muss an zwei Stellen eine 1 eingetragen werden. Jedoch mit der Bedingung, dass

zwischen V und der 1. Stelle,
zwischen der 1. und der 2. Stelle
und zwischen der 2. Stelle und Q

jeweils nicht mehr als 16 Nullen stehen dürfen.

Unter diesen Bedingungen sollen die zwei Stellen mit den niedrigsten Preisen , d.h. Preise(Stelle 1)+Preise(Stelle 2) = möglichst klein



Ich hoff, dass ichs einigermaßen verständlich dargestellt hab Wink

Liebe Grüße,
Andi
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 05.12.2013, 22:39     Titel:
  Antworten mit Zitat      
Hallo,

mir ist die Problemstellung weiterhin nicht wirklich klar.

Ein Fehler ist auf jeden Fall
Code:
fun= @(x) Preise(x1+V)+Preise(x2+V)

Die Zielfunktion hängt so ja gar nicht vom Input x ab!

Meinst du vielleicht das?
Code:
fun= @(x) Preise(x(1)+V)+Preise(x(2)+V)


Was ist Preise hier? Eine Funktion? Eine Variable?
In letzterem Fall bedeutet das wohl, dass x nur Integerwerte annehmen kann? Das muss dann ja auch noch berücksichtigt werden.

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

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.12.2013, 17:15     Titel:
  Antworten mit Zitat      
Zitat:
Ein Fehler ist auf jeden Fall

Code:
fun= @(x) Preise(x1+V)+Preise(x2+V)



Die Zielfunktion hängt so ja gar nicht vom Input x ab!

Meinst du vielleicht das?

Code:
fun= @(x) Preise(x(1)+V)+Preise(x(2)+V)



Ah, okay dann muss ich den Startvektor folgendermaßen angeben, richtig?

Code:
x = [1; 1]


dann gibt mir der genetische Algorithmus leider wieder x = 2.0000 18.0000 aus




Zitat:
Was ist Preise hier?


Preise ist ein Vektor 96x1 double

Grüße,
Andi
 
Harald
Forum-Meister

Forum-Meister


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

bei genetischen Algorithmen musst du an sich überhaupt keinen Startvektor angeben.

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

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.12.2013, 18:48     Titel:
  Antworten mit Zitat      
Zitat:
bei genetischen Algorithmen musst du an sich überhaupt keinen Startvektor angeben.


Okay, hab jetzt mal den Startvektor weggelassen und den Code noch bisschen vereinfacht, weil mir aufgefallen ist, dass das ziemlich doppelt gemoppelt war, weil ich zwei Bedingungen mit A*x<=b und mit den Grenzen für x quasi doppelt drin hatte. Jetzt sieht das ganze so aus:

Code:


    Q=z(t+1)
    V=z(t)
   
   
   
    fun= @(x) Preise(x(1))+Preise(x(2))
   
    [x,fval] = ga(fun,2,[-1 1],[16],[],[],[V; Q-16],[V+16; Q])



Die Ungleichung -1*x(1) + 1*x(2) <= 16 sorgt dafür, dass der Abstand zwischen x(1) und x(2) nicht größer als 16 wird
und die Grenzen stellen sicher, dass x(1) nicht mehr als 16 von V und x(2) nicht mehr als 16 von Q entfernt ist.

soweit stimmt das, oder?

Wenn ich nun den Algorithmus durchlaufen lasse, kommt folgender Fehler:

Code:


Attempted to access Preise(64);
index must be a positive
integer or logical.

Error in
@(x)Preise(x(1))+Preise(x(2))


Error in
createAnonymousFcn>@(x)fcn(x,FcnArgs{:})
(line 11)
fcn_handle = @(x)
fcn(x,FcnArgs{:});

Error in makeState (line 48)
            firstMemberScore =
            FitnessFcn(state.Population(initScoreProvided+1,:));
           
Error in galincon (line 18)
state =
makeState(GenomeLength,FitnessFcn,Iterate,output.problemtype,options);

Error in ga (line 351)
            [x,fval,exitFlag,output,population,scores]
            =
            galincon(FitnessFcn,nvars,
            ...

Error in Code_optimierung (line
116)
    [x,fval] = ga(fun,2,[-1
    1],[16],[],[],[V;
    Q-16],[V+16; Q])

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



wobei

Code:

>> Preise(64)

ans =

    40



Hast du ne Idee, woher der Fehler rührt?

Liebe Grüße,
Andi
 
Harald
Forum-Meister

Forum-Meister


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

Zitat:
Hast du ne Idee, woher der Fehler rührt?

Habe ich, und es wundert mich an sich, dass du ihn bisher nicht hattest.

Ich darf mich selbst zitieren:
Zitat:
In letzterem Fall bedeutet das wohl, dass x nur Integerwerte annehmen kann? Das muss dann ja auch noch berücksichtigt werden.

Falls du eine halbwegs aktuelle MATLAB-Version hast, kannst du dies machen, indem du IntCon auf 1:2 setzt.

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

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.12.2013, 22:50     Titel:
  Antworten mit Zitat      
Zitat:
In letzterem Fall bedeutet das wohl, dass x nur Integerwerte annehmen kann? Das muss dann ja auch noch berücksichtigt werden.

Falls du eine halbwegs aktuelle MATLAB-Version hast, kannst du dies machen, indem du IntCon auf 1:2 setzt.


AAAhh ja, jetzt funktionierts Smile

Das war tatsächlich das einzige Problem Wink

Vielen vielen Dank Harald!!

Liebe Grüße,
Andi
 
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.