Question

J'ai écrit un algorithme de croisement uniforme pour une partie de mes devoirs, mais il ne fonctionne pas correctement. Il est de retour en fait de moins bons résultats que mon un point de croisement. Je voudrais juste quelqu'un pour montrer où je me trompe si je peux le réparer :) plaire. J'ai essayé depuis des siècles maintenant et c'est mon dernier recours !!

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

La méthode prend en tant que paramaters deux parents, p1id et p2id. crée ensuite les ArrayLists de la représentation - P1 et P2.

Dans la boucle for, « » nbits est le poids de la matrice (ou la longueur du tableau). Ma méthode de croisement d'un point de l'utilise dans la boucle et il fonctionne très bien.

Je génère alors soit 1/2 pour déterminer quel gène de chaque parent l'enfant aura.

L'aptitude de cet algorithme est très très pauvre !! Toute aide à tous serait grandement apprécié.

Merci.

Était-ce utile?

La solution

Eh bien, tout d'abord quel type d'information vous encodez et qu'est-ce que vous essayez de Evolve ?

En fonction du problème que vous essayez de résoudre, certains types de stratégies cross-over vous empêcher de jamais trouver de bonnes solutions.

Un exemple simple : si la solution que vous recherchez a une symétrie inhérente (par exemple, un classificateur majorité des automates cellulaires blanc / noir), vous seul point de croisement ne sera jamais donner de très bons résultats parce qu'il est briser toute symétrie que l'algorithme génétique peut avoir trébuché sur (par exemple, si dans le cas du classificateur majoritaire, il sera très bon à classer noir ou blanc, mais pas les deux, donc il ne sera jamais mieux qu'une donnée - assez faible - remise en forme ).

Autres conseils

(Comme vous n'avez pas répondu à mon commentaire, je vais le répéter comme réponse)

Vous comparez un double avec une constante qui est problématique pour les flottants points, en utilisant int selected probablement faire mieux, ou si vous avez besoin d'utiliser un double, essayez d'utiliser quelque chose comme:

if (selected < 1.5)
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top