mouais enfin, ça n'a pas tellement de sens de considérer une loi discrète avec un nombre de modalités tel que le vecteur des probabilités ne tient pas dans la mémoire d'un ordinateur. Si on arrive à ce problème il faut peut-être repenser son modèle.Quand tu fais cumsum (et peut-être find aussi mais je ne suis pas certain), tu imposes de lire la totalité de b, et donc la vitesse est au minimum fonction linéaire de la taille de b. Au contraire l'algorithme précédent n'est pas juste beaucoup plus laid à écrire, il est aussi plus performant quand la taille de b devient inconfortablement grande.
Règle sur le pouce: tant que b rentre en mémoire vive, l'écriture typique matlab que tu indiques sera la meilleure. Mais dès que b est trop gros il faut devenir très prudent avec l'écriture typique matlab. Cela dit, quand on manipule des trucs plus gros que la mémoire vive, une autre règle sur le pouce c'est de passer à python.
Bonjour,
Pour ce type de traitement je ne comprends pas pourquoi vous n'utilisez pas plutôt le C (par exemple).
Les langages interprétés sont surtout faits pour des traitements ponctuels.
Par ailleurs, dans le cas présent, puisque la probabilité d'un chromosome d'être tiré est pondérée dans des proportions non négligeables, le choix de commencer par la plus grande probabilité me semble un critère important dans l'étude de l'algorithme.
Le tableau des sommes cumulées étant trié, une recherche dichotomique serait sans doute plus efficace.
Scilab semble disposer de la fonction appropriée : dsearch().
Excellent! Est-ce que tu connais une fonction qui fait la meme chose sans qu'on ai besoin de calculer d'abord les sommes cumulees? (sinon le gain apportee par dsearch sera mange par cette etape).Le tableau des sommes cumulées étant trié, une recherche dichotomique serait sans doute plus efficace.
Scilab semble disposer de la fonction appropriée : dsearch().
Pour envisager d'autres améliorations, il faudrait savoir si le tableau des probabilités est réutilisé ou non.
* S'il est réutilisé, alors on peut aussi se resservir du tableau des sommes cumulées.
* Sinon, la seule amélioration possible serait de faire une boucle de cumul des probabilités en s'arrêtant lorsque la somme dépasse la valeur de référence (cette méthode nécessite en moyenne de ne parcourir que la moitié des probabilités)
PS : je ne connais pas SciLab
L'argument mathématique est le suivant: si F est la fonction de répartition d'une certaine loi, et si U est une variable uniforme entre 0 et 1, alors X = F^{-1}(U) suit ladite loi. Le tout est de coder l'inverse de F. La solution que j'ai proposée ne fait que comparer les valeurs discrètes à U et compte le nombre de ces valeurs qui sont plus petites que U, c'est ce que signifie la commande sum(cumsum(x)<u) où u est runif(1).
Bonsoir,
Merci pour vos réponses claires. Grace à vous j'ai réglé mon problème.
Cependant, vous semblez tous utiliser Matlab. Comment l'avez vous eu?
Vous devez payer chaque mois? Autre chose, pour ceux qui connaissent Scilab, savez vous si il y a un équivalent de "num2str" pour Scilab.
Merci à vous.
Bonne soirée.
En tapant
num2str scilab
dans google on tombe sur cette page...
https://help.scilab.org/docs/5.4.1/e...i_num2str.html
Je ne connais pas scilab et donc je ne sais pas à quel point c'est proche de matlab, mais il existe un clone gratuit de matlab qui s'appelle octave.
https://www.gnu.org/software/octave/
Mon psychiatre, pour quinze mille francs, il m'a débarrassé de ce que j'avais : quinze mille francs
merci pour octave. Il n'est pas disponible sur Windows 10. Faut que j'in,stalle une machine virtuelle.
Sinon je n'arrive pas à comprendre ce que votre code fait.
Dans la matrice b, il y a les 190 probabilité de tirer un couple de chromosome. B est rangée dans l'ordre croissant.Code:c(1)=0; for i=1:190 c(1+i)=b(i)+c(i); end disp(max(find(c<rand(1))))
Je visualise ce qu'est la matrice c.
Mais pouvez vous me dire pas à pas ce que fait ceci:
voila ce que je pense: rand(1): je génèreun nombre entre 0 et 1Code:max(find(c<rand(1)))
c<rand(1) ??? je ne comprends pas. C'est quoi c? c c'est une matrice dans mon cas. une matrice plus petite qu'un nombre???? je dois passer à côté de qq chose.
Hesite pas à jeter un oeil sur la doc matlab
C'est pas que je veux pas t'expliquer ce que ça fait, mais en lisant la doc tu verras les options possibles et c'est toujours intéressant de les connaître.
La fonction find
https://fr.mathworks.com/help/matlab/ref/find.html
La fonction max
https://fr.mathworks.com/help/matlab/ref/max.html
rand
https://fr.mathworks.com/help/matlab/ref/rand.html
Mon psychiatre, pour quinze mille francs, il m'a débarrassé de ce que j'avais : quinze mille francs
Tout-à-fait. Sous matlab c'est interprété comme "compare chaque valeur dans la matrice c à une valeur tirée au hasard (la même pour toute les lignes) et renvoi une matrice qui à chaque ligne contient 1 ou 0 selon que la comparaison est vrai ou faux, respectivement". Ensuite find génère la liste des numéros de lignes qui contiennent des 1, et finalement max renvoi la ligne la plus grande parmi cette liste.
Un bon truc quand tu galères sur ce genre de ligne c'est de la réécrire en la développant, puis de regarder ce qui se passe entre chaque étape
Edit: croisement & +1!Code:preliminaire=rand(1), prems=c<preliminaire, deuze=find(prems), tresse=max(deuze), pareil=max(find(c<preliminaire))
Dernière modification par Jiav ; 20/02/2017 à 19h51.
Parfait.
Avec ces trois liens j'ai tous compris.
Merci beaucoup pour cette bonne pédagogie.
CDT
Je reviens vers vous à propos de ce code ci dessus. Maintenant que je le comprends, je ne comprends pas pourquoi il simule ce que je voulais faire à la base cad tirer un élément d'un vecteur sachant que chaque "case" du vecteur a une probabilité (connue) d'être tirée.
Dans mon cas, chaque b(i) est une case qui contient sa probabilité d'être tirée. Alors c=(0 ; b(1) ; b(1)+b(2) ; ... ; 1)
Je tire un nombre :rand(1) .
Par exemple 0.07 alors avec le programme si dessus, je vais avoir le numéro de la ligne de c qui va bien.
Par exemple si c(154)=0.069 et c(155)=0.070001 alors le programme me renvoi 154.
De ce nombre ,je peux en déduire que c'est le 154 ème élément de c soit b(1)+b(2)+ ... +b(153)
Ok et après? cela veux dire quoi ? Que c'est le 153ème élément de b qui a été sélectionné?
Dernière modification par gloups13 ; 20/02/2017 à 20h30.
Exactement.
ca veut dire que je suis au même niveau que lors de mon poste #1?
...
Bonsoir,
Gloups, vous n'avez pas de chance, au lieu de vous expliquer comment pointer sur le chromosome ou le groupe de chromosomes qu'il y a lieu de choisir en fonction de la probabilité d'être choisi, on vous balance des codes dans un langage auquel vous n'avez pas accès.
Répartissez vos chromosomes en une vingtaines de classes, un tirage aléatoire vous adressera une classe et dans la classe vous en choisirez un, que vous pourrez combiner avec un autre chromosome choisi par la même méthode.
Etant donné que la probabilité la plus grande est à droite de votre liste vous avez intérêt à écrire un code du genre :
a = rand()
if (a > b[i-1])
{
... c'est cette classe
}
else if (a > b[i-2]
{
... c'est cette classe
}
etc.
Bonne soirée.
En #1 tu avais un problème que tu ne savais pas résoudre. Maintenant ton problème est résolu et la solution expliquée en long en large et en détail. Bref, je ne comprend pas ton message #47.
OK .
Merci à tous pour votre aide. Pour ma part, je considère ce problème résolu
Bonne journée.
Hello,
Bon ok le problème est résolu. Mais est-ce que la résolution du problème est bien comprise ? Hésite pas à dire si y'a des points pas très clairs on peut y revenir
C'est bien beau de faire des choses qui marchent mais c'est encore mieux de savoir pourquoi elles marchent.
Mon psychiatre, pour quinze mille francs, il m'a débarrassé de ce que j'avais : quinze mille francs