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

 
shurick:

Un grand merci à l'auteur pour la bibliothèque !

Ajoutez la ligne "cnt++ ;" dans la boucle de la fonction de recherche parente, sinon elle risque d'entrer dans une boucle éternelle !

En effet, dans certains cas, la boucle peut devenir infinie - lorsqu'il n'y a qu'un seul individu dans la population.

Merci pour votre message, j'apporterai les modifications nécessaires dans les plus brefs délais.

PS Il est très probable que j'ai oublié d'insérer cnt++, après tout, c'est la raison pour laquelle j'ai entré cette variable. :)

Je me souviens d'avoir voulu faire la boucle avec l'opérateur for(), afin qu'il soit possible de réguler la "persistance" de la recherche de différents parents, mais j'ai ensuite changé d'avis, n'y voyant pas beaucoup d'intérêt.

Документация по MQL5: Основы языка / Операторы / Оператор цикла for
Документация по MQL5: Основы языка / Операторы / Оператор цикла for
  • www.mql5.com
Основы языка / Операторы / Оператор цикла for - Документация по MQL5
 
@joo Est-il possible d'utiliser votre bibliothèque pour compiler les paramètres des indicateurs Ishimoku, MAKD, etc.
 
Graff:
@joo Est-il possible d'utiliser votre bibliothèque pour la sélection des paramètres des indicateurs Ishimoku, MAKD, etc.

Si vous posez la question : "Pour quelles tâches d'optimisation du trader est-il impossible d'utiliser la bibliothèque ? - je ne saurais que répondre.

Bien sûr que si.

 
joo:

Si vous posez la question suivante : "Pour quelles tâches d'optimisation du trader est-il impossible d'utiliser la bibliothèque ? - je ne saurais que répondre.

Bien sûr que si.

Désolé pour cette question stupide, je ne suis pas un programmeur. Si possible, veuillez partager le code dans lequel votre bibliothèque est utilisée pour faire correspondre plusieurs paramètres à un indicateur (par exemple, Ishimoku, MAKD) afin de clarifier son fonctionnement.
 
Graff:
Désolé pour cette question stupide, je ne suis pas un programmeur. Si possible, veuillez partager le code, où votre bibliothèque est utilisée pour sélectionner plusieurs paramètres pour un indicateur (par exemple, Ishimoku, MAKD) pour la clarté de son travail.

La question n'est pas du tout stupide.

Utilisez le deuxième exemple de l'article. Remplacez l'indicateur ZZ par n'importe quel autre. Au lieu de lire les sommets ZZ, vous devez écrire vos propres conditions (MACD, par exemple, vous obtiendrez le même zigzag alternatif, mais selon les règles que vous avez définies). Il n'y a rien de compliqué. Essayez, écrivez le code. Si vous échouez, posez des questions, en montrant les endroits du code qui posent problème. Ceux qui sont intéressés verront des façons de résoudre leurs tâches, vous et tout le monde en tirerez profit. Si vous ne voulez pas apprendre le langage, contactez"Work".

 

2joo :

Pourriez-vous m'expliquer l'essence de la fonction RemovalDuplicates() ? La question est la suivante : si nous avons deux chromosomes identiques, doivent-ils tous les deux être marqués comme des doublons, ou l'un d'entre eux doit-il rester non marqué comme un doublon pour une utilisation ultérieure ?

De plus, pour accélérer cette fonction, je suggère que la boucle Ch2 commence avec la valeur Ch+1, car il n'y a pas d'intérêt à ce que Ch2 commence à zéro :

      //Выбираем второй из пары...

      for (Ch2=Ch+1;Ch2<PopulChromosCount;Ch2++)

et si la réponse à ma question est que les deux chromosomes sont marqués comme duplicata, alors au lieu de :

          if(cnt==GeneCount)
            chromosomeUnique[Ch2]=0;

do :

          if (cnt==GeneCount) {
            chromosomeUnique[Ch]=0;
            chromosomeUnique[Ch2]=0;
          }

Et si la réponse est qu'il faut laisser un chromosome NON marqué comme duplicata, alors la boucle Ch2 devrait de toute façon commencer avec la valeur Ch+1.

 
shurick:

2joo :

Pourriez-vous m'expliquer l'essence de la fonction RemovalDuplicates() ? La question est la suivante : si nous avons deux chromosomes identiques, doivent-ils tous les deux être marqués comme des doublons, ou l'un d'entre eux doit-il rester non marqué comme un doublon pour une utilisation ultérieure ?

L'algorithme de cette fonction est le suivant :

Nous marquons tous les chromosomes avec la caractéristique d'unicité "1". Nous pensons que tous les chromosomes sont uniques.

Vérifier s'il existe des chromosomes identiques. Pour ce faire, nous dupliquons virtuellement la population et comparons tous les chromosomes entre eux, tout en sautant les paires ayant le même numéro de séquence. Les doublons trouvés sont marqués avec la caractéristique de doublon "0".

Ensuite, nous copions tous les chromosomes restants non marqués "0" dans le tableau temporaire. Nous obtenons un tableau temporaire rempli sans lacunes, et nous savons déjà combien de chromosomes uniques il reste dans la population.

Il ne reste plus qu'à recopier les chromosomes dans la population. Comme vous pouvez le constater, il n'y a pas de suppression de chromosomes, les chromosomes uniques sont seulement déplacés vers le début de la population.


Pour tester cette fonction, écrivez un script et essayez d'introduire manuellement des combinaisons délicates de tableaux remplis. Vous constaterez l'efficacité ou l'inefficacité de la fonction. Calculez le plus petit nombre possible de vérifications des colonnes du tableau et comparez-le au nombre de fois que la fonction RemovalDuplicates() vérifie les colonnes.

 
joo:

ZY Pour tester cette fonction, écrivez un script et essayez d'introduire manuellement des combinaisons délicates de tableaux remplis. Vous constaterez l'efficacité ou l'inefficacité de la fonction. Calculez le plus petit nombre possible de vérifications des colonnes du tableau et comparez-le au nombre de fois que la fonction RemovalDuplicates() vérifie les colonnes.

Lorsque vous démarrez la boucle "for (Ch2=Ch+1)", le nombre d'itérations nécessaires et suffisantes diminuera d'un facteur de 2 et demi et l'un des doublons ne sera pas marqué comme tel. Je me demandais à quel point il serait plus correct de laisser un chromosome des doublons unique ! En d'autres termes, la fonction a pour tâche d'éliminer les chromosomes identiques, mais un exemplaire des chromosomes dupliqués me semble préférable de le restituer à la population, car la présence de ses duplicatas ne prouve pas sa vitalité. Par exemple : s'il existe un tableau de chromosomes {1,3,4,7,7,7,6,7,8,8}, je pense que la suppression optimale des doublons donnerait le résultat suivant : {1,3,4,7,6,8}. Les chromosomes 7 et 8 seront donc examinés plus avant.
 
shurick:
Au début de la boucle "for (Ch2=Ch+1)", le nombre d'itérations nécessaires et suffisantes sera réduit de deux fois et l'un des chromosomes dupliqués ne sera pas marqué comme tel. Je me demandais à quel point il serait plus correct de laisser un chromosome des doublons unique ! En d'autres termes, la tâche de la fonction est d'éliminer les chromosomes identiques, mais une copie des chromosomes dupliqués me semble préférable de retourner à la population, car la présence de ses duplicatas ne prouve pas sa vitalité. Par exemple : s'il existe un tableau de chromosomes {1,3,4,7,7,7,6,7,8,8}, je pense que la suppression optimale des doublons donnerait le résultat suivant : {1,3,4,7,6,8}. Les chromosomes 7 et 8 seront donc examinés plus avant.

Votre remarque précédente sur cnt++ était juste. Mais cette fois-ci, vous avez tort. Je vous suggère de ne pas spéculer sur "Que se passera-t-il si... ?" mais d'écrire un script, de tester la fonction et de démontrer le résultat.

Un seul chromosome unique subsiste, les autres copies exactes seront reconnues comme des doublons et "supprimées".

C'est probablement l'une des fonctions les plus "moscovites" de tout l'algorithme UGA. C'est celle qui m'a pris le plus de temps. Mais elle ne contient aucune erreur.


PS L'essentiel est qu'il n'y ait pas de vérifications répétées des mêmes chromosomes - c'est ce qui est fait.

Le nombre de vérifications de l'unicité est le minimum nécessaire. Si vous parlez du nombre d'exécutions dans l'opérateur for(), vous pouvez les réduire (alors que le nombre de vérifications de l'unicité restera le même - le minimum possible) en introduisant une variable supplémentaire, augmentant chaque fois d'une unité la variable imbriquée. Cela ralentira la fonction.

PPS Si vous mettez l'accent sur :

shurick:

....

combien plus correct serait de laisser un chromosome unique parmi les duplicatas ! C 'est-à-dire que la tâche de la fonction est d'éliminer les chromosomes identiques, mais une copie des chromosomes dupliqués me semble préférable de retourner à la population, parce que la présence de ses duplicatas ne prouve pas sa vitalité.

La fonction est d'éliminer les doublons. C'est ainsi qu'on l'appelle. Il ne s'agit pas d'éliminer les chromosomes identiques. Vous voyez la différence ? Cette fonction ne fait pas de distinction entre les chromosomes en fonction de leur viabilité. Par conséquent, seuls les chromosomes uniques restent dans une copie unique sans doublons.

PPPS J'apporterai une précision supplémentaire au cas où.

Supposons que nous ayons une population composée de 20 chromosomes (pour des raisons de simplicité et de clarté, avec un seul gène entier), problème de maximisation :

|7|2|3|9|2|4|5|3|3|5|6|2|4|3|5|10|6|7|7|2|

C'est-à-dire que dans une population de chromosomes contenant le gène

2 - 4 morceaux

3 - 4 pièces

4 - 2 pièces

5 - 3 pièces

6 - 2 pièces

7 - 3 pièces

9 - 1 pièce

10 - 1 pièce.

Total - 20 morceaux de chromosomes.

Après élimination des doublons, la population se présentera comme suit, avec 8 chromosomes restants :

|7|2|3|9|4|5|6|10|

Il reste donc un chromosome unique, les autres sont des doublons et seront "supprimés"

après l'appel de la fonction.

PopulationRanking();

à la fin de la fonction.

RemovalDuplicates()

La population ressemblera à ceci :

|10|9|7|6|5|4|3|2|

 
joo:

PPPS Je vais apporter une autre précision au cas où.

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 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. Merci encore pour la bibliothèque et pour les explications sur la fonction.

Résultat du script de contrôle de l'optimisation des fonctions

Dossiers :