Discussion de l'article "Algorithmes Génétiques - C'est Facile !" - page 5

 
shurick:

Merci beaucoup pour cette clarification, la question sur la suppression des doublons a reçu une réponse satisfaisante. Je joins le code du script démontrant la fonction originale et la fonction optimisée, qui démontre la réduction du nombre de passages dans les boucles. Dans mon commentaire actuel, je ne signale PAS de bogue dans la fonction, mais je suggère son optimisation, et mon objectif principal était de découvrir le principe de la suppression des doublons, ce à quoi j'ai reçu une réponse complète. Encore une fois, merci beaucoup pour la bibliothèque et pour la clarification de la fonction.

110 et 160, c'est trop pour 20 chromosomes.... Vous avez placé le compteur au mauvais endroit.

C'est le bon endroit :

//Sélectionner le deuxième de la paire....
      for (Ch2=Ch+1;Ch2<PopulChromosCount;Ch2++)
      {
        //count_cicles++ ; // DEBUG compte combien de fois nous passons les cycles Ch et Ch2
        if (Ch!=Ch2 && chromosomeUnique[Ch2]!=0)
        {
          count_cicles++; // DEBUG compte combien de fois nous comparons les chromosomes.
          //Remettons à zéro le décompte du nombre de gènes identiques
          cnt=0;
          /Vérifier les gènes, tant que les gènes sont les mêmes.
          for (Ge=1;Ge<=GeneCount;Ge++)
          {
            if (Population[Ge][Ch]!=Population[Ge][Ch2])
              break;
            else
              cnt++;
          }
          //Si le nombre de gènes identiques est identique au nombre total de gènes
          //...le chromosome est reconnu comme un double.
          if (cnt==GeneCount)
            chromosomeUnique[Ch2]=0;
        }

OK. Essayez maintenant la même population, avec les mêmes chromosomes, mais dans cette séquence :

int m_init[20] = {7,7,7,3,9,2,4,5,3,3,5,6,2,4,3,5,10,6,2};

Qu'observe-t-on ?

 

à shurick:

En effet. Le nombre de vérifications d'unicité, avec tous les chromosomes différents, peut être calculé par la formule suivante

(PopulChromosCount^2-PopulChromosCount)/2

Dans notre exemple, qui comporte 20 chromosomes (en supposant que tous les chromosomes sont différents), le nombre de vérifications serait le suivant :

(20*20-20)/2=190

Ceci est confirmé par cette vérification :

int  m_init[20]  = {1,2,3,4,5,6,6,7,8,9,9,10,11,12,13,14,15,16,17,18,19,20};

Si les doublons sont détectés, il y aura encore moins de vérifications.

Nous vous remercions de votre participation active au projet!

Des modifications appropriées seront apportées à la bibliothèque. Bien que ces changements n'affectent pas les capacités de recherche de l'algorithme, ils rendront son travail plus rationnel.

 
joo:

Que regardons-nous ?

Résultat

Bien que les changements n'affecteront en rien les capacités de recherche de l'algorithme

Tout à fait exact, la qualité de l'algorithme ne changera pas, bien qu'au départ j'en doutais, mais maintenant vous me l'avez prouvé, mais ces doutes ont permis de trouver une méthode d'optimisation :)

 
Mise à jour de la bibliothèque UGA et des exemples dans l'article. Version libre actuelle de l'auteur 1.2.1.
Dossiers :
 
Mise à jour de la bibliothèque UGA et des exemples pour cet article. Version libre actuelle 1.2.1.
Dossiers :
 

J'ai étudié l'article et j'ai trouvé une incohérence dans le code : la même formule est utilisée dans deux fonctions pour obtenir des valeurs de plage:

/Réplication
void Replication
...
    //Fixons les limites de la création d'un nouveau gène
    Minimum = C1-((C2-C1)*ReplicationOffset);
    Maximum = C2+((C2-C1)*ReplicationOffset);
...

/////////////////////////////////////////////

// Mutation artificielle.
void ArtificialMutation
...
    //Fixons les limites de la création d'un nouveau gène
    Minimum=C1-((C2-C1)*ReplicationOffset);
    Maximum=C2+((C2-C1)*ReplicationOffset);
...

C'est-à-dire que l'on obtient des données en dehors des valeurs de deux gènes, ce qui est caractéristique d'une "mutation artificielle". S'agit-il d'un bogue ou existe-t-il une autre explication ?

Il me semble que pour la méthode de réplication, il est nécessaire de changer les signes :

Minimum = C1+((C2-C1)*ReplicationOffset) ;

Maximum = C2-((C2-C1)*ReplicationOffset) ;


 
Batohov:

J'ai étudié l'article et j'ai trouvé cette incohérence dans le code, deux fonctions utilisent la même formule pour obtenir des valeurs de plage:

C'est-à-dire que l'on obtient des données en dehors des valeurs de deux gènes, ce qui est caractéristique d'une "mutation artificielle". S'agit-il d'un bogue ou existe-t-il une autre explication ?

Il me semble que pour la méthode de réplication, il est nécessaire de changer les signes :

Minimum = C1+((C2-C1)*ReplicationOffset) ;

Maximum = C2-((C2-C1)*ReplicationOffset) ;

Il n'y a pas d'erreur ou d'incohérence. Tant dans la réplication que dans la mutation artificielle, les limites de l'apparition probable d'un nouveau gène (les sections de code que vous avez citées) sont définies de la même manière.

Mais dans le cas de la réplication, la zone de probabilité se situe à l'intérieur de ces limites, et dans le cas de la mutation artificielle, au-delà de ces limites.

La réplication sert à transférer des traits caractéristiques des gènes des deux parents (à l'intérieur des limites).

La mutation artificielle sert à générer de nouveaux gènes différents de ceux des parents (en dehors des limites).

 
joo:

Il n'y a pas d'erreur ou d'incohérence. Tant dans la réplication que dans la mutation artificielle, les limites de l'apparition probable d'un nouveau gène (les sections de code que vous avez citées) sont définies de la même manière.

Mais pour la réplication, la zone de probabilité se situe à l'intérieur de ces limites, et pour la mutation artificielle, au-delà de ces limites.

La réplication sert à transférer des traits caractéristiques des gènes des deux parents (à l'intérieur des limites).

La mutation artificielle sert à générer de nouveaux gènes différents de ceux des parents (en dehors des limites).

Merci pour votre réponse rapide, je comprends votre raisonnement.
 
joo:

Au fait, c'est très agréable d'être le destructeur de l'un des plus célèbres mythes de trader liés à ZZ (la deuxième tâche de l'article). :)

Apparemment, je n'ai pas compris la formulation de la tâche. Ma déclaration :

Les points d'entrée pour un profit maximum avec la condition que le trade min. soit de N pips, sont situés sur les sommets du ZigZag avec la condition du genou min. N + Spread pips.

 
joo:

J'ai posté quelques fonctions de test intéressantes dans le fil de discussion du forum MQL4 "Test Multivariable Multiextremal Function", l'une d'entre elles est présentée dans l'article.

Si vous le souhaitez, vous pouvez essayer de trouver les extrema des fonctions proposées en utilisant d'autres algorithmes d'optimisation que l'AG et poster les résultats ici. Vous êtes les bienvenus. Ce sera intéressant pour tout le monde et pour moi en premier lieu.

Je me rends compte qu'il est très important d'évaluer la validité de l'ajustement. L'une des méthodes consiste à ajouter du bruit aux données originales.

Les codes sources des méthodes d'optimisation alternatives se trouvent ici(http://alglib.sources.ru/optimization/) et ici(http://ool.sourceforge.net/).

Il est évident que chaque algorithme d'optimisation est plus performant avec ses propres classes de fonctions cibles.

Quelles fonctions cibles utilisez-vous dans la pratique ?