Domanda

Ho scritto un algoritmo crossover uniforme per parte dei miei compiti, ma non funziona correttamente. In realtà sta restituendo risultati peggiori rispetto al mio punto di cross. Vorrei solo che qualcuno sottolineasse dove sto sbagliando così posso risolverlo per favore :). Ci sto provando da anni e questa è la mia ultima risorsa !!

    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));
}

Il metodo accetta come parametri i due genitori, P1ID e P2ID. Quindi crea le liste di array della rappresentazione - P1 e P2.

Nel loop per loop, "nbits" è il peso dell'array (o la lunghezza dell'array). Il mio metodo crossover a un punto lo usa nel ciclo per e funziona bene.

Quindi genero uno dei due 1/2 per determinare quale gene da ciascun genitore riceverà il bambino.

L'idoneità di questo algoritmo è molto scarsa !! Qualsiasi aiuto sarebbe molto apprezzato.

Grazie molto.

È stato utile?

Soluzione

Bene, prima di tutto Che tipo di informazione Stai codificando e Cosa stai cercando di evolversi?

A seconda del problema che stai cercando di risolvere, alcuni tipi di strategie incrociate ti impediranno di trovare buone soluzioni.

Un semplice esempio: se la soluzione che stai cercando ha una simmetria intrinseca (ad es. Classificatore di maggioranza automobilistica cellulare bianca/nera), il cross-over a punto singolo non ti darà mai risultati molto buoni perché sta rompendo qualsiasi simmetria su cui l'algoritmo genetico potrebbe essersi inciampato (eg Quindi, nel caso del classificatore della maggioranza, sarà molto bravo a classificare il bianco o il nero, ma non entrambi, quindi non diventerà mai meglio di un dato - abbastanza basso - fitness).

Altri suggerimenti

(Poiché non hai risposto al mio commento, lo ripeterò come risposta)

Stai confrontando un doppio con una costante che è problematica per i numeri dei punti galleggianti, usando int selected Probabilmente farà meglio, o nel caso in cui tu abbia bisogno di usare un doppio, prova a usare qualcosa di simile:

if (selected < 1.5)
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top