Bonjour!
J'ai écrit un programme Matlab que j'ai ensuite cherché à optimiser, mais le temps d'exécution du script "améliorer" est supérieur à celui du script initial
Le script permet de modéliser l'évolution des fréquences des allèles (un variant d'un gène) dans une population, en fonction des générations.
Le script est un tirage aléatoire de N allèles (génération t+1) dans un ensemble de N d'allèle (génération t), suivant une loi binomiale.
Le code initial est ici :
Ce qui est intéressant pour la modélisation, c'est la fréquence Pa. Le fait de garder en mémoire Na sous forme d'une matrice est donc inutile. De plus, on peut remplacer rand*N<Na(j-1) par rand<Pa(j-1) puisque Pa=Na/NCode:T=input('nombre de générations '); Na=zeros(1,T); Pa=zeros(1,T); %Préallocation de mémoire, pour éviter l'allocation dynamique (création d'une nouvelle colonne à chaque génération) %Na et Pa représente respectivement le nombre d'allèles a dans la population et la fréquence de cet allèle N=input('taille de la population d''allèle '); Pa(1)=input('proportion de l''allèle considérée '); Na(1)=Pa(1)*N; for j=2:T if (Pa(j-1)~=0)&&(Pa(j-1)~=1) for i=1:N if rand*N<Na(j-1) Na(j)=Na(j)+1; end end Pa(j)=Na(j)/N; end if Pa(j-1)==0 Pa(j)=0; end if Pa(j-1)==1 Pa(j)=1; end end
Le script modifié est donc :
Pour une simulation sur 500 générations, avec 50 000 allèles, et Pa=0,5; on obtient 25 s pour le 2nd script, et 16s pour le 1erCode:T=input('nombre de générations '); Pa=zeros(1,T); N=input('taille de la population d''allèle '); Pa(1)=input('proportion de l''allèle considérée '); for j=2:T Na=0; if (Pa(j-1)~=0)&&(Pa(j-1)~=1) for i=1:N if rand<Pa(j-1) Na=Na+1; end end Pa(j)=Na/N; end if Pa(j-1)==0 Pa(j)=0; end if Pa(j-1)==1 Pa(j)=1; end end
Voilà donc si vous aviez une idée expliquant ça
Et toutes remarques ou conseils pour optimiser le script sont les bienvenus
-----