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-Toolbox: Ganza Zahlen als Constraint definieren

 

kub
Forum-Anfänger

Forum-Anfänger


Beiträge: 17
Anmeldedatum: 29.07.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 30.07.2009, 09:15     Titel: GA-Toolbox: Ganza Zahlen als Constraint definieren
  Antworten mit Zitat      
Hallo zusammen,

ich habe eine Frage zur implementierung von Constraints in der GA-Toolbox.
Und zwar möchte ich für eine Optimierungsvariable nur ganze Zahlen (oder ganze Zahlen +/- eine gewisse Toleranz) zulassen. Das wäre theoretisch über den Modulo-Operator möglich, indem ich für die Variable x1 mod(x1,1)<0.01 definiere. Damit würde ich für x1 ganze Zahlen mit einer Toleranz von 0.01 zulassen.
Meine Frage lautet nun, wie ich das am besten implementiere, bzw. ob es überhaupt möglich ist?

Danke und Grüße
kub
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


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

Diese Möglichkeit ist insofern schlecht, als es durch das unstetige Verhalten sehr schwierig für eine Population sein wird, sich daran anzupassen.

Wenn es sich bei den ganzzahligen Variablen um nur eine handelt, würde ich die Zielfunktion mit round(x1) auswerten und round(x1) als letztliches Ergebnis betrachten.
Gefahr: x1 muss stark mutieren, um überhaupt andere Werte anzunehmen.
Workaround: round(x1*10) und entsprechend round(x1*10) als Ergebnis betrachten.

Noch sauberer ist es natürlich, die Variablen explizit einzuschränken. Dazu müsste man allerdings eigene creation, mutation und crossover functions schreiben und immer sicherstellen, dass da am Ende ganzzahlige Variablen rauskommen, wo es gewünscht ist. Damit ist also ein gewisser Aufwand verbunden.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 17
Anmeldedatum: 29.07.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 30.07.2009, 09:50     Titel:
  Antworten mit Zitat      
Ja es handelt sich nur um eine Variable (von insgesamt 10), die möglichst ganzzahlige Werte annehmen soll.
Kann ich round(x1) denn in den Constraints definieren oder muss es in der Optimierungsroutine selbst implementiert werden? Wenn als Constraint, wäre ich für ein Beispiel dankbar, da ich noch relativ unerfahren in Matlab bin.

kub
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.449
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 30.07.2009, 10:04     Titel:
  Antworten mit Zitat      
Hallo,

ich würde es nicht in den Constraints, sondern direkt in der Fitnessfunktion umsetzen. Wenn du also sqrt(1 + x1^2) minimieren willst, würde ich stattdessen sqrt(1 + round(x1)^2) minimieren. Und wenn als Ergebnis für x1 5,3 rauskommt, würde ich das als 5 interpretieren. Falls es Constraints gibt, die sich auf x1 beziehen, müssten die ebenso umgesetzt werden.

Aber damit ein wenig vorsichtig sein, weil das ein Workaround ist.
Welche Werte sind denn sinnvoll für die ganzzahlige Variable?

Aus Neugierde würde mich auch mal der Hintergrund des ganzen interessieren.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 17
Anmeldedatum: 29.07.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 30.07.2009, 10:11     Titel:
  Antworten mit Zitat      
Das implementieren in der Fitnessfunktion is etwas schwierig, da es sich um Radiale Basisfunktionen handelt. Da müsste ich mich mal hineinknien, und schauen ob es möglich ist.

Der Hintergrund ist folgender:
Ich optimiere eine elektrische Maschine, indem ich mehrere Zielgrößen, wie Drehmoment etc., mit Hilfe von Radialen Basisfunktionen zunächst approximiere und den Optimierungsalgorithmus auf diese Funktion anwende. Das Problem ist, dass einer der Parameter die Windungszahl der Maschine ist, welche natürlich nur ganzzahlige Werte annehmen kann. Bisher habe ich den resultierenden Wert im nachhinein gerundet, was allerdings die Genauigkeit des Ergebnisses verschlechtert.

Grüße,
kub
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.449
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 30.07.2009, 10:21     Titel:
  Antworten mit Zitat      
In welcher Größenordnung ist die Windungszahl? Gibt es da obere und untere Schranken?
Private Nachricht senden Benutzer-Profile anzeigen
 
kub
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 17
Anmeldedatum: 29.07.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 30.07.2009, 10:24     Titel:
  Antworten mit Zitat      
Ja es gibt Schranken und der Bereich liegt etwa bei 10-20.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.449
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 30.07.2009, 10:34     Titel:
  Antworten mit Zitat      
Es mag nicht der eleganteste Weg sein, aber spricht etwas dagegen, die Windungszahl fest anzunehmen und dann die restlichen Parameter zu optimieren? Also

Code:
for windungszahl = 10:20
optimiere restliche Parameter mit windungszahl
falls Ergebnis besser als bei vorherigen Durchläufen, merken
end


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

Forum-Anfänger

Forum-Anfänger


Beiträge: 17
Anmeldedatum: 29.07.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 30.07.2009, 10:49     Titel:
  Antworten mit Zitat      
Würde auch gehen. Diesen (Um-)Weg will ich aber vermeiden. Außerdem verwende ich eine Mehrzieloptimierung und die Pareto-Front hätte dann nicht mehr unterschiedliche Windungszahlen.
Ich versuche mal die Rundungsbedingung zu implementieren.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.449
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 30.07.2009, 10:56     Titel:
  Antworten mit Zitat      
Vielleicht kannst du ja eine andere Funktion zwischenschalten, die das runden übernimmt, um nicht zuviel Aufwand zu treiben

Code:
function fitness(...)
x(1) = round(x(1));
Aufruf der eigentlichen Fitnessfunktion; alle Parameter durchleiten


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

Forum-Anfänger

Forum-Anfänger


Beiträge: 17
Anmeldedatum: 29.07.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 30.07.2009, 11:00     Titel:
  Antworten mit Zitat      
Das ist eine gute Idee. Werde ich mal versuchen. Mal sehen, ob es den Algorithmus nicht verwirft, wenn man die Parameterwerte ändert.
Private Nachricht senden Benutzer-Profile anzeigen
 
kub
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 17
Anmeldedatum: 29.07.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 30.07.2009, 13:59     Titel:
  Antworten mit Zitat      
Also das zwischenschalten der Rundungs-Funktion klappt prima.
Bei den Ergebnissen ist allerdings darauf zu achten, dass der Optimierer die nicht gerundeten Paremeter ausgiebt (da er ja von der Rundungsoperation nichts weiß). Die Ergebnisse entsprechen ihrerseits jedoch den gerundeten Parametern.

Vielen Dank für die Hilfe!
Grüße
kub
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.