Tirage rapide entre bitsets.
Bonjour.
Je fais des simulations individus centrées pour le boulot (comprenne qui pourra). Lors de ces simulations, les individus se reproduisent, donnent des enfants et transmettent leur gènes.
J'ai modélisé une série de gènes via des bitset, et lors de la reproduction, un enfant vas donc "hériter" (à ne pas confondre avec ce que l'on appelle héritage en c++), d'une des versions (A ou B) que chacun de ses parents porte (et qui en fait provienne de ses grands parents si on remonte...).
Grosso modo, j'ai donc besoin de remplir un bitset, en choisissant une fois sur deux une valeur issu d'un autre bitset (A ou B).
J'ai finalement opté pour un remplissage complet de mon bitset de destination par l'un des deux possibles (la A), puis par une boucle, avec un tirage aléatoire qui décide si je remplace cette valeur par l'autre possible( la B).
Cependant, si cette méthode est légèrement plus rapide que mon "if else" précédent, cela fait plus que doubler le temps de simulation (comparé à si je remplis simplement avec le A).
Ce morceau de code me parait très simple est difficilement optimisable, mais comme je n'ai pas une formation d'informaticien, je passe peut être (surement ?) à côté de quelque chose et je vous soumet donc le problème.
Pour précision, j'utilise la bibliothèque GSL (peut être améliorable aussi de ce côté là).
Code:
1 2 3 4 5 6 7 8 9 10 11
| neutres_A = maman.neutres_A;
neutres_B = papa.neutres_A;
for (int i=0;i<32;i++) {
if (gsl_rng_uniform_int(gene,2)==0) {
neutres_A[i] = maman.neutres_B[i];
}
if (gsl_rng_uniform_int(gene,2)==0) {
neutres_B[i] = papa.neutres_B[i];
}
} |