Frage

Ich habe einen einheitlichen Crossover -Algorithmus für einen Teil meiner Hausaufgaben geschrieben, aber er funktioniert nicht richtig. Es kehrt tatsächlich schlechtere Ergebnisse zurück als mein einziger Punkt. Ich möchte nur, dass jemand darauf hinweist, wo ich falsch gehe, damit ich es bitte reparieren kann :). Ich habe jetzt schon seit Ewigkeiten versucht und dies ist mein letzter Ausweg !!

    private void DoUniformCrossOver(int p1id,int p2id)
{
    ArrayList<Integer> p1 = population.get(p1id).GetRep();
    ArrayList<Integer> p2 = population.get(p2id).GetRep();
    ArrayList<Integer> c1 = new ArrayList<Integer>();
    ArrayList<Integer> c2 = new ArrayList<Integer>();

for (int i=0;i<nbits;++i)
{
    double selected = CS2004.UI(1,2);
    if (selected ==1)
    {
        c1.add(p1.get(i));
        c2.add(p2.get(i));
    }
    else
    {
        c1.add(p2.get(i));
        c2.add(p1.get(i));
    }
}

    population.add(new ScalesChrome(c1));
    population.add(new ScalesChrome(c2));
}

Die Methode wird als Paramater die beiden Elternteile P1ID und P2ID erfasst. Dann erstellt die Arraylisten der Darstellung - P1 und P2.

In der für Schleife ist 'Nbits' das Gewicht des Arrays (oder die Länge des Arrays). Meine Ein-Punkte-Crossover-Methode verwendet sie in der für Schleife und funktioniert gut.

Ich erzeuge dann entweder 1/2, um zu bestimmen, welches Gen von jedem Elternteil das Kind bekommt.

Die Fitness dieses Algorithmus ist sehr sehr schlecht !! Jede Hilfe wäre sehr geschätzt.

Danke vielmals.

War es hilfreich?

Lösung

Naja als aller erstes Welche Art von Informationen Kodieren Sie und Was versuchst du weiterzuentwickeln??

Abhängig von dem Problem, das Sie zu lösen versuchen, verhindern einige Arten von Cross-Over-Strategien Sie daran, jemals gute Lösungen zu finden.

Ein einfaches Beispiel: Wenn die gesuchte Lösung eine inhärente Symmetrie hat (z. B. ein weißer/schwarzer Mobilfunk-Automata-Mehrheitsklassifizierer), wird Ihnen ein einzelner Punkt niemals sehr gute Ergebnisse liefern Im Fall des Mehrheitsklassifikators wird es also sehr gut darin sein, Schwarz oder Weiß zu klassifizieren, aber nicht beides, also wird es nie besser als eine gegebene - ziemlich niedrige - Fitness).

Andere Tipps

(Da Sie nicht auf meinen Kommentar geantwortet haben, werde ich ihn als Antwort wiederholen)

Sie vergleichen ein Doppel mit einer Konstante, die für schwimmende Punktzahlen problematisch ist int selected Wird es wahrscheinlich besser abschneiden oder falls Sie ein Doppel verwenden müssen, versuchen Sie es mit etwas wie:

if (selected < 1.5)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top