Verfasst am: 27.11.2013, 20:04
Titel: Optimierung mit Hilfe von Genetischem Algorithmus
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.
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!
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
Andi1218
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 05.12.2013, 17:44
Titel:
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(1<Preise(2)+Preise(1
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
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.
bei genetischen Algorithmen musst du an sich überhaupt keinen Startvektor angeben.
Grüße,
Harald
Andi1218
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 06.12.2013, 18:48
Titel:
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:
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.
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
Andi1218
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 08.12.2013, 22:50
Titel:
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
Das war tatsächlich das einzige Problem
Vielen vielen Dank Harald!!
Liebe Grüße,
Andi
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.