Discussion de l'article "Algorithmes Génétiques - C'est Facile !" - page 8
Vous manquez des opportunités de trading :
- Applications de trading gratuites
- Plus de 8 000 signaux à copier
- Actualités économiques pour explorer les marchés financiers
Inscription
Se connecter
Vous acceptez la politique du site Web et les conditions d'utilisation
Si vous n'avez pas de compte, veuillez vous inscrire
1) Le conteur ? Hmm, je n'ai malheureusement pas compris l'humour. La vérification de la base de données a lieu dans la fonction CheckHistoryChromosomes(chromos,historyHromosomes ) qui est appelée à partir de GetFitness(historyHromosomes). C'est pourquoi j'ai dit correctement - il n'y a pas d'exécutions répétées de FF.
2) Le rapprochement avec la base de données s'effectue en vérifiant les gènes. Et chaque gène est normalisé par SelectInDiscreteSpace(temp,RangeMinimum,RangeMaximum,Precision,3) lorsqu'un nouveau chromosome apparaît. Il n'y a donc pas de "contes de fées" ici non plus.
3) Voir 2)
1,2,3) J'ai compris. C'est presque ça. La normalisation est bien là, mais ce n'est toujours pas une raison pour comparer des nombres réels "sans écart" pour l'égalité. :)
SelectInDiscreteSpace() a été légèrement retravaillé. Je n'ai pas aimé le fait que vous corrigiez Step en interne. Ce n'est pas une affaire royale de corriger un utilisateur. Du moins, pas cette fois-ci.
L'utilisateur peut avoir des considérations raisonnables pour rendre Step "irrationnel" en ce qui concerne la gamme des changements de gènes.
Voici comment cela s'est passé :
SelectInDiscreteSpace() a été légèrement modifié. Je n'aime pas le fait que vous corrigiez Step inside. Ce n'est pas au roi de corriger un utilisateur. Du moins pas cette fois-ci.
L'utilisateur peut avoir des considérations raisonnables pour rendre Step "irrationnel" en ce qui concerne la gamme des changements de gènes.
Comprenez bien :
Le fait est que l'étape peut être telle qu'elle divisera l'espace en un nombre non entier de sections, et ce n'est pas bon, car la question se pose immédiatement de savoir de quel côté du nombre saisi il faut "saisir" la valeur sur la ligne numérique (on ne sait pas ce qui est "droit", droite ou gauche) - mon algorithme donne une réponse adéquate, mais le vôtre, hélas. C'est pourquoi vous devez procéder de cette manière :
step = (InMax - InMin) / MathCeil ( (InMax - InMin) / step );Voici quelques exemples comparatifs des résultats de votre code et du mien :
La signification d'une telle normalisation est différente de NormalizeDouble (), mais c'est au propriétaire, qui ne l'aime pas, d'utiliser la normalisation au signe requis, et non avec un pas spécifié comme dans SelectInDiscreteSpace().
Tout est clair, comme dans le message précédent.
Andrei, toutes les variantes énumérées ont le droit d'exister ici. La vôtre aussi, bien sûr. Le flottement, la modification de la discrétisation au cours de l'optimisation mérite une attention particulière.
--
A propos de tout en général :
Vous devriez ajouter des paramètres, une bibliothèque d'opérateurs génétiques, etc. Et vous devriez réfléchir à l'avance à des extensions et à une utilisation pratiques.
Je pense tout réécrire sur des objets, faire une interface plus puissante à la fois pour le programme et pour l'utilisateur (graphique, avec de nombreux paramètres dans des onglets). Il y a des choses à ajouter, d'autres à co-optimiser.
Plus précisément, je suis toujours en train de réfléchir à la question de savoir s'il faut se baser sur votre code (utiliser des fragments) ou le réécrire entièrement.
Si vous voulez participer, écrivez en privé.
Il n'est pas sûr que je le publie. Nous verrons bien. Pour l'instant, je veux le faire pour moi-même.
A propos de tout en général :
1) Dans le bon sens - il faut ajouter des personnalisations, une bibliothèque d'opérateurs génétiques, etc. et penser à une extension et une utilisation pratiques à l'avance.
2) Plus précisément, je réfléchis toujours à la question de savoir s'il faut se baser sur votre code (utiliser des fragments) ou le réécrire entièrement.
3) Si vous voulez participer, écrivez en privé.
1) Au contraire, j'essaie de réduire le nombre de paramètres UGA sans réduire la flexibilité du contrôle.
2) Je connais plusieurs personnes qui utilisent le code de l'article dans leurs projets tel quel, et d'autres qui ont réécrit le code à partir de 0.
3) Je vous ai écrit dans un message privé.
Tout cela est compréhensible, tout comme le message précédent.
Andrei, toutes les options énumérées ici ont le droit d'exister. La vôtre aussi, bien sûr. La discrétion flottante, qui change au cours du processus d'optimisation, mérite une attention particulière.
--
A propos de tout en général :
Vous devriez ajouter des paramètres, une bibliothèque d'opérateurs génétiques, etc. Et vous devriez réfléchir à l'avance à des extensions et à une utilisation pratiques.
Je pense tout réécrire sur les objets, faire une interface plus puissante, à la fois pour le programme et pour l'utilisateur (graphique, avec beaucoup de paramètres dans des onglets). Il y a des choses à ajouter, d'autres à co-optimiser.
Plus précisément, je suis encore en train de me demander si je dois me baser sur votre code (utiliser des fragments) ou le réécrire entièrement.
...Vladimir, veux-tu rouler ou conduire ?
Veux-tu un beau code ou veux-tu construire un GA plus cool que celui du testeur ?
Je pense personnellement que celui du testeur est assez cool, mais il y a peu de paramètres.
.
Vladimir, voulez-vous rouler ou conduire ?
Voulez-vous un beau code ou construire un GA plus cool que celui du testeur ?
Personnellement, je pense que celui du testeur est plutôt cool, mais une seule nuance n'est pas un paramètre suffisant.
.
Je veux un code pratique. Facile à utiliser, à étendre, à modifier et à intégrer.
Je veux un code pratique. Facile à utiliser, à étendre, à modifier et à intégrer.
Remplacer la ligne 175 par .
Sans cela, le rapport sur le travail échoue avec une erreur.
Remplacer la ligne 175 par .
Sans cela, le rapport d'opération échouera avec une erreur.
Oui, une erreur de division par 0 se produira s'il n'y a pas eu d'amélioration pour un nombre donné d'époques depuis la première exécution de la boucle gen. operator.
Il est plus simple, et plus logique, d'assigner 1 à la variable resetCounterFF dès l'initialisation :