Diskussion zum Artikel "Genetische Algorithmen - Leicht gemacht!" - Seite 8

 
joo:

1) Geschichtenerzähler? Hmm, ich habe leider den Humor nicht verstanden. Die Datenbankprüfung erfolgt in der Funktion CheckHistoryChromosomes(chromos,historyHromosomes ) , die aus GetFitness(historyHromosomes) aufgerufen wird. Deshalb habe ich richtig gesagt - es gibt keine wiederholten Durchläufe von FF.

2) Der Abgleich mit der Datenbank erfolgt mit der Überprüfung nach Genen. Und jedes Gen wird durch SelectInDiscreteSpace(temp,RangeMinimum,RangeMaximum,Precision,3) normalisiert, wenn ein neues Chromosom erscheint. Also auch hier keine "Märchen".

3) Siehe 2)

1,2,3) Ich hab's. Fast. Die Normalisierung ist wirklich da. Aber es ist immer noch kein Grund, reale Zahlen "ohne Lücke" auf Gleichheit zu vergleichen. :)

SelectInDiscreteSpace() wurde leicht überarbeitet. Mir hat es nicht gefallen, dass Sie Step intern korrigieren. Es ist keine königliche Angelegenheit, einen Benutzer zu korrigieren. Zumindest nicht dieses Mal.

Der Benutzer kann vernünftige Überlegungen anstellen, um Step "irrational" zu machen in Bezug auf den Bereich der Genveränderungen.

Es hat sich so ergeben:

double SelectInDiscreteSpace
(
double In, 
double InMin, 
double InMax, 
double step, 
int    RoundMode
)
{
  if (step==0.0)
    return(In);
  // sicherstellen, dass die Grenzen korrekt sind
  if ( InMax < InMin )
  {
    double temp = InMax; InMax = InMin; InMin = temp;
  }
  // falls verletzt, Rückgabe der verletzten Grenze
  if ( In < InMin ) return( InMin );
// if ( In > InMax ) return( InMax ); // Und das machen wir am Ende, всё равно придётся
  if ( InMax == InMin || step <= 0.0 ) return( InMin );
  // auf einen bestimmten Maßstab bringen
// step = (InMax - InMin) / MathCeil ( (InMax - InMin) / step );  // Nein, wir bringen es nicht auf den "vorgegebenen Maßstab".
  switch ( RoundMode )
  {
  case 1:  In = ( InMin + step * MathFloor ( ( In - InMin ) / step ) );
  case 2:  In = ( InMin + step * MathCeil  ( ( In - InMin ) / step ) );
  default: In = ( InMin + step * MathRound ( ( In - InMin ) / step ) );
  }
  return fmin(In,InMax);
}
 
MetaDriver:

SelectInDiscreteSpace() wurde leicht geändert. Es gefällt mir nicht, dass Sie Step inside korrigieren. Es ist nicht die Aufgabe des Königs, einen Benutzer zu korrigieren. Zumindest nicht dieses Mal.

Der Benutzer kann vernünftige Überlegungen anstellen, um Step "irrational" in Bezug auf den Bereich der Genveränderungen zu machen.

Verstehen Sie das:

Die Sache ist die, dass Step so beschaffen sein kann, dass er den Raum in eine nicht-ganzzahlige Anzahl von Abschnitten unterteilt, und das ist nicht gut, denn sofort stellt sich die Frage, von welcher Seite der eingegebenen Zahl man den Wert auf der numerischen Zeile "abgreifen" soll (man weiß nicht, was "rechts" ist, rechts oder links) - mein Algorithmus gibt eine adäquate Antwort, aber Ihrer, leider. Deshalb müssen Sie es auf diese Weise machen:

step = (InMax - InMin) / MathCeil ( (InMax - InMin) / step );

Hier sind einige Vergleichsbeispiele für die Ergebnisse Ihres und meines Codes:



Ergebnis


Meiner Ihr
In 2,2 2 2
InMIN 2
InMAX 3
Schritt 0,8






Ergebnis


Meine Ihr
In 2,8 3 2,8
InMIN 2
InMAX 3
Schritt 0,8






Ergebnis


Meine Ihr
In 2,2 2,25 2,3
InMIN 2
InMAX 3
Schritt 0,3
 
Die Bedeutung einer solchen Normalisierung unterscheidet sich von NormalizeDouble (), aber es ist dem Besitzer überlassen, wer es nicht mag, kann die Normalisierung auf das gewünschte Vorzeichen verwenden, nicht mit einem bestimmten Schritt wie in SelectInDiscreteSpace().
 
joo:
Die Bedeutung einer solchen Normalisierung unterscheidet sich von NormalizeDouble (), aber es ist dem Besitzer überlassen, wer es nicht mag, kann die Normalisierung auf das gewünschte Vorzeichen verwenden, nicht mit einem bestimmten Schritt wie in SelectInDiscreteSpace().

Es ist alles klar, genau wie im vorherigen Beitrag.

Andrei, alle aufgeführten Varianten haben hier ihre Daseinsberechtigung. Deine natürlich auch. Die fließende, wechselnde Diskretion während der Optimierung verdient besondere Aufmerksamkeit.

--

Zu allem im Allgemeinen:

Man sollte Einstellungen hinzufügen, eine Bibliothek mit genetischen Operatoren, usw. Und man sollte im Voraus über bequeme Erweiterungen und Verwendung nachdenken.

Ich denke daran, alles auf Objekte umzuschreiben und eine leistungsfähigere Schnittstelle sowohl für das Programm als auch für den Benutzer zu schaffen (grafisch, mit vielen Einstellungen in Registerkarten). Einige Dinge sind hinzuzufügen, einige Dinge sind zu optimieren.

Genauer gesagt überlege ich immer noch, ob ich es auf der Grundlage Ihres Codes machen soll (Fragmente verwenden) oder ob ich es ganz neu schreiben soll.

Wenn Sie mitmachen wollen, schreiben Sie mir privat.

Es ist nicht sicher, dass ich es veröffentlichen werde. Wir werden sehen. Im Moment möchte ich es für mich selbst machen.

 
MetaDriver:

Über alles im Allgemeinen :

1) Auf eine gute Art und Weise - Sie müssen Anpassungen, eine Bibliothek mit genetischen Operatoren usw. hinzufügen und im Voraus über eine bequeme Erweiterung und Verwendung nachdenken.

2) Genauer gesagt, denke ich immer noch darüber nach, ob ich es auf der Grundlage deines Codes machen soll (Fragmente verwenden) oder ob ich es ganz neu schreiben soll.

3) Wenn du mitmachen willst, schreibe mir privat.

1) Im Gegenteil, ich versuche, die Anzahl der UGA-Parameter zu reduzieren, ohne die Flexibilität der Steuerung zu verringern.

2) Ich kenne mehrere Leute, die den Code aus dem Artikel in ihren Projekten so verwenden, wie er ist, und solche, die den Code von 0 an umgeschrieben haben.

3) Ich habe Ihnen in einer privaten Nachricht geschrieben.

 
MetaDriver:

Das ist alles verständlich, genau wie der vorherige Beitrag.

Andrei, alle hier aufgeführten Optionen haben ihre Daseinsberechtigung. Ihre natürlich auch. Die fließende Diskretion, die sich während des Optimierungsprozesses ändert, verdient besondere Aufmerksamkeit.

--

Über alles im Allgemeinen :

Man sollte Einstellungen hinzufügen, eine Bibliothek mit genetischen Operatoren usw. Und man sollte im Voraus über bequeme Erweiterungen und Verwendung nachdenken.

Ich denke daran, alles auf Objekte umzuschreiben und eine leistungsfähigere Schnittstelle zu schaffen, sowohl für das Programm als auch für den Benutzer (grafisch, mit vielen Einstellungen in Registerkarten). Einige Dinge sind hinzuzufügen, einige Dinge sind zu ko-optimieren.

Genauer gesagt, überlege ich immer noch, ob ich es auf der Grundlage Ihres Codes machen soll (Fragmente verwenden) oder ob ich alles neu schreiben soll.

...

Vladimir, willst du fahren oder fahren?

Willst du einen schönen Code oder willst du eine GA bauen, die cooler ist als die des Testers?

Ich persönlich denke, dass die Testerin ziemlich cool ist, aber es gibt ein paar Parameter.
.

 
Urain:

Vladimir, willst du fahren oder fahren lassen?

Willst du einen schönen Code oder eine GA bauen, die cooler ist als die des Testers?

Ich persönlich denke, dass der Tester ziemlich cool ist, nur eine Nuance ist nicht genug Parameter.
.

Ich möchte einen praktischen Code. Einfach zu benutzen, zu erweitern, zu ändern und einzubetten.

 
MetaDriver:

Ich möchte einen praktischen Code. Einfach zu verwenden, zu erweitern, zu ändern und einzubetten.

Dann beschreiben Sie das Objektmodell von GA. Erstellen Sie leere Klassen entsprechend dem beschriebenen Modell, und füllen Sie sie dann mit Code und schreiben Sie die Interaktion vor.
 

Ersetzte Zeile 175 durch.

        NormalizeDouble((double)SumOfCurrentEpoch/MathMax(1,(double)resetCounterFF),2),

Ohne dies schlägt der Auftragsbericht mit einem Fehler fehl.

 
Rich:

Ersetzte Zeile 175 mit.

Ohne dies wird der Operationsbericht mit einem Fehler fehlschlagen.

Ja, ein Fehler bei der Division durch 0 tritt auf, wenn es seit dem ersten Durchlauf der gen.-Operator-Schleife für eine bestimmte Anzahl von Epochen keine Verbesserung gegeben hat.

Am einfachsten und logisch korrekter ist es, der Variablen resetCounterFF gleich bei der Initialisierung eine 1 zuzuweisen:

int    resetCounterFF   =1;// "Epochen ohne Besserung" Zähler zurücksetzen