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

 

Dans la bibliothèque libre de l'article, travaillez avec le génotype. Travaillez avec le phénotype dans FF (comme dans l'exemple 2).

Cela signifie que la bibliothèque fonctionnera aussi efficacement si le phénotype est traité en FF, mais que le nombre d'itérations (exécutions en FF) sera nettement plus élevé que si l'AG travaille directement avec le phénotype (parce que l'espace de recherche est plus détaillé). Dans la limite, la recherche (sans raffinement du phénotype) tend vers un espace de recherche continu.

 

Bonne nuit.

Je voudrais vous remercier pour cet excellent article.

Il était un peu compliqué pour moi au début, mais j'ai fini par comprendre.

Avant d'écrire quelque chose dans ce fil de discussion, je voudrais m'assurer que j'ai bien compris votre article et le déroulement de l'algorithme UGA :

1)Réglage des paramètres d'entrée de l'UGA pour une tâche particulière.

---UGA

2) Création d'une colonie initiale de parents par combinaison aléatoire de gènes

2.2)Calcul du résultat de la FF pour chacune de ces colonies

2.3)Suppression des clones.

3) Détermination du meilleur résultat de FF pour tous les individus de cette colonie.

4) Démarrage du cycle de création d'une colonie de descendants à partir de la première colonie. Les descendants sont créés à l'aide des outils suivants le croisement, la mutation artificielle et naturelle, la réplication de gènes et l'emprunt de gènes, où

Croisement - échange de parties des chromosomes des parents,

mutation artificielle - sélection de gènes hors de portée (gène du parent 1, gène du parent 2).

Est. Mutation - sélection de gènes dans l'intervalle (Minimum de l'intervalle des gènes, Maximum de l'intervalle des gènes).

réplication - sélection de gènes dans des plages proches des valeurs des gènes parentaux, mais avec un certain décalage.

emprunt de gènes - création d'un "individu assemblé" à partir d'un nombre de parents égal au nombre de gènes.

5 )Suppression des clones

6) Calcul du résultat de la FF pour chacune de ces colonies

7) Comparaison des résultats des individus descendants avec le résultat de référence et son remplacement éventuel. En cas de remplacement, le compteur "Epoques sans changement de la valeur de référence" est remis à zéro.

8) Tri de tous les individus du meilleur au pire

9) --> élément 4

10) S'il y a eu des époques sans changement de Y, on termine et on affiche la valeur de référence trouvée.

Je m'excuse d'avance, il s'agit peut-être d'un fil de discussion plutôt que d'un tutoriel, mais je n'ai pas d'autre endroit où demander des conseils. J'ai en fait rencontré l'AG pour la première fois dans votre article (avant votre article, je ne comprenais même pas ce que les mots "Fast(genetic algorithm)" signifiaient dans le testeur de terminal), donc mes connaissances et mon expérience (j'ai commencé à programmer en MQL5 il y a environ 2 mois) sont un peu limitées.

Si je comprends votre algorithme GA, j'essaierai de le transposer en OOP. C'est pour cela que j'ai commencé à l'étudier. J'ai déjà mis en place des modèles de trading, auto-optimisés avec la recherche directe, mais pas encore avec GA (modèles sur le principe décrit dans l'article https://www.mql5.com/ru/articles/217 ).

Merci d'avance.

Генетические алгоритмы - это просто!
Генетические алгоритмы - это просто!
  • 2010.05.25
  • Andrey Dik
  • www.mql5.com
В статье автор расскажет об эволюционных вычислениях с использованием генетического алгоритма собственной реализации. Будет показано на примерах функционирование алгоритма, даны практические рекомендации по его использованию.
 

mi__x__an:

...je voudrais savoir si j'ai bien compris votre article et le déroulement de l'algorithme de l'UGA

D'une manière générale, oui, c'est correct.
 

Bonjour .

Je vous remercie pour votre réponse rapide.

J'ai quelques questions à poser.

double Chromosome[];           //Ensemble des arguments de la fonction optimisée - gènes
                               //(par exemple : poids des réseaux neuronaux, etc.) - chromosome
int    GeneCount           =0; // Nombre de gènes dans un chromosome
double RangeMinimum        =0.0;//Étendue minimale de la recherche
double RangeMaximum        =0.0;/Maximum de la plage de recherche
double Precision           =0.0;//Étape de recherche
int    OptimizeMethod      =0; //1-minimum, tout autre - maximum

Qu'est-ce que le tableau de chromosomes ici ? Les valeurs possibles du paramètre optimisé ?

Si, par exemple, nous optimisons la "taille de lotminimale " dans la plage de 0,1 à 1 (avec un pas de lot minimal de 0,1),

alors le tableau ressemblera à ceci:{0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1.0}, nombre de gènes dans le chromosome 1, minimum 0.1 maximum 1.0, pas 0.1 ? C'est bien cela ?

Et une question connexe, comment entrer dans un tel tableau, par exemple : Stop Loss optimisé [10...500], Take Profit [10...500], Taille de lot minimum [0.1...1.0] et Trailing flag (utiliser le trailing ou non) [0...1] ?

En général, à quoi devraient ressembler les données d'entrée lors de l'optimisation de paramètres avec différents types, minima et maxima de valeurs possibles ?

Merci d'avance pour la réponse.

Документация по MQL5: Стандартные константы, перечисления и структуры / Состояние окружения / Информация об инструменте
Документация по MQL5: Стандартные константы, перечисления и структуры / Состояние окружения / Информация об инструменте
  • www.mql5.com
Стандартные константы, перечисления и структуры / Состояние окружения / Информация об инструменте - Документация по MQL5
 
mi__x__an:

Quel est le tableau de chromosomes ici ? Les valeurs possibles du paramètre optimisé ?

Si, par exemple, nous optimisons la "tailleminimale du lot" dans l'intervalle de 0,1 à 1 (avec un pas de lot minimal de 0,1),

alors le tableau ressemblera à ceci:{0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1.0}, nombre de gènes dans le chromosome 1, minimum 0.1 maximum 1.0, pas 0.1 ? C'est bien cela ?

Et une question connexe, comment entrer dans un tel tableau, par exemple : Stop Loss optimisé [10...500], Take Profit [10...500], Taille de lot minimum [0.1...1.0] et Trailing flag (utiliser le trailing ou non) [0...1] ?

En général, à quoi devraient ressembler les données d'entrée lors de l'optimisation de paramètres avec différents types, minima et maxima de valeurs possibles ?

Merci d'avance pour la réponse.

Non,

double Chromosome[];           //Ensemble des arguments de la fonction optimisée - gènes

Chromosome[] correspond exactement à ce qui est indiqué dans le commentaire.

Le premier indice [0] est la valeur de la condition physique de l'individu. Les autres sont des paramètres optimisés dans une fourchette donnée. Il s'agit du génotype.

Travailler avec le phénotype (stop loss, take profit, volumes, indicateurs ou autre) dans FF (mise à l'échelle des paramètres optimisés dans la plage des gènes du chromosome) :

Par exemple, les gènes sont définis dans l'intervalle [-1;1], alors

Index 0 : Valeur FF <---------------------------------------------------------[8;8]//pivot à Pi/2 huitièmes.

1er indice : Stop loss [10..500] <------------------------------------------------ [-1;1]

2ème indice : Take profit [10..500] <--------------------------------------------- [-1;1]

3ème indice : Volume minimum du lot [0.1...1.0] <--------------------------------------- [-1;1]

4ème index : Trailing flag (utiliser le trailing ou non) [0..1] <------ [-1;1]

En outre, le tableau Chromosome[] comporte 5 cellules. Par exemple, un chromosome peut ressembler à {0.2, 0.3, -0.8, 0.1, 0.9;}

 
Mais dans ce cas, le traitement de l'exactitude des valeurs des gènes non réels devra être effectué dans FF. Par exemple, si nous optimisons les types long, double et bool, l'UGA générera des valeurs réelles pour chacun d'entre eux, y compris pour bool, il y aura de nombreuses variations de gènes dans la plage allant de RangeMinimum à RangeMaximum, avec l'utilisation réelle possible de seulement deux valeurs 1 et 0. Est-ce que je comprends bien ? Et la sélection des valeurs correctes sera-t-elle déjà effectuée dans FF ?
Документация по MQL5: Основы языка / Типы данных / Целые типы / Типы char, short, int и long
Документация по MQL5: Основы языка / Типы данных / Целые типы / Типы char, short, int и long
  • www.mql5.com
Основы языка / Типы данных / Целые типы / Типы char, short, int и long - Документация по MQL5
 
mi__x__an:
Mais dans ce cas, le traitement de l'exactitude des valeurs des gènes non réels devra être effectué dans FF. Par exemple, si nous optimisons les types long, double et bool, l'UGA générera des valeurs réelles pour chacun d'entre eux, y compris pour bool, il y aura de nombreuses variations de gènes dans la plage allant de RangeMinimum à RangeMaximum, avec l'utilisation réelle possible de seulement deux valeurs 1 et 0. Est-ce que je comprends bien ? Et la sélection des valeurs correctes se fera déjà dans FF ?
Correct, si cela ne convient pas, vous devriez utiliser un algorithme génétique binaire (tel que celui implémenté dans le testeur). Il y a un article à ce sujet sur le quatrième forum.
 

La meilleure façon de se débarrasser de cet inconvénient, pour moi personnellement, serait d'introduire une fonction de service qui corrige les valeurs des gènes des chromosomes pour les rendre utilisables dans le FF.

-->Génération de descendants -->ajustement des valeurs des gènes aux valeurs réellement utilisables -->élimination des clones -->appel du FF.

Pensez-vous que cette façon de procéder aura un impact important sur les performances de l'UGA ? Après tout, en principe, le nombre d'exécutions de FF devrait être réduit si l'étape d'optimisation d'un paramètre est plus importante que celle de l'autre.

 
Urain:
Si cela ne convient pas, vous devriez utiliser un algorithme génétique binaire (tel que celui implémenté dans le testeur). Il y a un article à ce sujet sur le quatrième forum.

Non, la question est différente. L'algorithme peut parfaitement être utilisé dans de tels cas.

mi__x__an:

Mais dans ce cas, le traitement de l'exactitude des valeurs, et non des gènes réels, devra être effectué dans FF. Par exemple, si nous optimisons les types long, double et bool, l'UGA générera des valeurs réelles pour chacun d'entre eux, y compris pour bool, il y aura de nombreuses variations de gènes dans la plage allant de RangeMinimum à RangeMaximum, avec l'utilisation réelle possible de seulement deux valeurs 1 et 0. Est-ce que je comprends bien ? Et la sélection des valeurs correctes se fera déjà dans FF ?

Toutes les opérations avec le phénotype devraient être effectuées dans FF. Il s'agit de décoder du génotype au phénotype.

Ok, supposons que le paramètre optimisé soit de type bool et que seules deux variantes soient possibles : true et false. Le décodage sera alors le suivant :

if(gene<(RangeMaximum+RangeMinimum )/2.0)

p=false;

else

p=true;

où le gène est un gène spécifique d'un chromosome.

Il s'avère qu'avec toute la variété des variantes possibles de ce gène (génotype), nous n'obtiendrons que deux phénotypes. C'est également le cas dans la nature vivante.

Cependant, une conséquence naturelle en découle : plus de variantes de chromosomes seront générées (et donc, plus de fois la FF sera calculée) qu'il n'est nécessaire pour résoudre le problème. En d'autres termes, l'optimisation prendra plus de temps. J'ai déjà mentionné ce point. Il en sera de même en cas de codage binaire des chromosomes. Vous devrez toujours décoder un phénotype spécifique à une tâche.

MAIS. Tant dans le cas du codage binaire que dans celui de la représentation des gènes par des nombres réels, il est très facile d'éviter les calculs FF inutiles (pour réduire le nombre de variantes chromosomiques possibles) en définissant les ÉTAPES DE RECHERCHE ET LES ÉTAPES POUR CHAQUE PARAMÈTRE OPTIMISÉ. En d'autres termes, il s'agit d'éliminer à l'avance les variantes de chromosomes inutiles (ce qui est déjà le cas dans l'optimiseur standard avec codage binaire). Cela peut également être fait pour l'AG de l'article, il suffit de lui ajouter la fonctionnalité appropriée - la possibilité de définir les limites et les étapes pour chaque gène, c'est-à-dire de permettre à l'AG de travailler directement avec le phénotype.

 

mais la nécessité de spécifier les limites et l'étape pour chaque gène de la bibliothèque réduira sa flexibilité.

Ce qui n'est probablement pas la meilleure, ni même la pire façon, je l'ai utilisée dans l'optimiseur de modèles de trading :

1 - classe du paramètre optimisé - CObject inheritor

class COptimizatedParam: public CObject
{
public:
 string name; //имя оптимизируемого параметра, требуется для выполнения ФФ(в моем случае у меня модель полностью так и работает как работала, только с виртуальным аккаунтом)
 string type; //тип оптимизируемого параметра, требуется для см. выше
 string on;   //с какого значения начать выполнение -минимум
 string step; //шаг
 string end;  //максимум
 string value; //в моем случае инициализация модели происходит по тому же CList, который передан функции оптимизации  и value -текущее значение оптимизируемого параметра
 void   Init(string Name,string Type,string On,string Step,string End)
             {name=Name;type=Type;on=On;step=Step;end=End;}
};

2 - fonction virtuelle du modèle général principal :

  virtual CList     *OptimizatedParams()

elle permet à chaque modèle spécifique de créer sa propre liste de paramètres optimisés.

3. fonction d'optimisation : elle énumère récursivement toutes les valeurs nécessaires.

Tous les types énumérés peuvent être traités par la fonction d'optimisation.

La question qui se pose à présent est la suivante : il serait rationnel de faire de CList une donnée d'entrée dans laquelle les informations relatives au paramètre optimisé sont transmises par le biais de cette classe de paramètre optimisé, et la bibliothèque UGA crée elle-même autant de limites et d'étapes que nécessaire pour chaque gène. Cela lui donnerait plus de souplesse et réduirait le nombre d'exécutions inutiles de FF pour créer des clones non pas génétiques mais phénotypiques.

Документация по MQL5: Основы языка / Объектно-ориентированное программирование / Виртуальные функции
Документация по MQL5: Основы языка / Объектно-ориентированное программирование / Виртуальные функции
  • www.mql5.com
Основы языка / Объектно-ориентированное программирование / Виртуальные функции - Документация по MQL5