programme tirant une boule parmi d'autres, pondéré avec des 'poids' - Page 2
Répondre à la discussion
Page 2 sur 2 PremièrePremière 2
Affichage des résultats 31 à 51 sur 51

programme tirant une boule parmi d'autres, pondéré avec des 'poids'



  1. #31
    minushabens

    Re : programme tirant une boule parmi d'autres, pondéré avec des 'poids'


    ------

    Citation Envoyé par Jiav Voir le message
    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.
    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.

    -----

  2. #32
    Dlzlogic

    Re : programme tirant une boule parmi d'autres, pondéré avec des 'poids'

    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.

  3. #33
    scroux

    Re : programme tirant une boule parmi d'autres, pondéré avec des 'poids'

    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().

  4. #34
    invite73192618

    Re : programme tirant une boule parmi d'autres, pondéré avec des 'poids'

    Citation Envoyé par Evil.Saien Voir le message
    on peut tester avec un grand nb
    On peut (en enlevant randperm qui n'est pas optimise), mais pas avec 2000! Si ca tient en memoire vive, ce n'est pas grand...

    Minushabens, je n'ai pas compris ton point.

  5. #35
    invite73192618

    Re : programme tirant une boule parmi d'autres, pondéré avec des 'poids'

    Citation Envoyé par scroux Voir le message
    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).

  6. #36
    scroux

    Re : programme tirant une boule parmi d'autres, pondéré avec des 'poids'

    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

  7. #37
    invite73192618

    Re : programme tirant une boule parmi d'autres, pondéré avec des 'poids'

    Citation Envoyé par scroux Voir le message
    faire une boucle de cumul des probabilités en s'arrêtant lorsque la somme dépasse la valeur de référence
    Oui c'est ce que je proposais plus haut, mais je suis à peu près certain qu'il y a moyen de faire mieux.

  8. #38
    minushabens

    Re : programme tirant une boule parmi d'autres, pondéré avec des 'poids'

    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).

  9. #39
    gloups13

    Re : programme tirant une boule parmi d'autres, pondéré avec des 'poids'

    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.

  10. #40
    Evil.Saien

    Re : programme tirant une boule parmi d'autres, pondéré avec des 'poids'

    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

  11. #41
    gloups13

    Re : programme tirant une boule parmi d'autres, pondéré avec des 'poids'

    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.
    Code:
    c(1)=0;
    for i=1:190
        c(1+i)=b(i)+c(i);
    end
    
    disp(max(find(c<rand(1))))
    Dans la matrice b, il y a les 190 probabilité de tirer un couple de chromosome. B est rangée dans l'ordre croissant.
    Je visualise ce qu'est la matrice c.
    Mais pouvez vous me dire pas à pas ce que fait ceci:
    Code:
    max(find(c<rand(1)))
    voila ce que je pense: rand(1): je génèreun nombre entre 0 et 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.

  12. #42
    Evil.Saien

    Re : programme tirant une boule parmi d'autres, pondéré avec des 'poids'

    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

  13. #43
    invite73192618

    Re : programme tirant une boule parmi d'autres, pondéré avec des 'poids'

    Citation Envoyé par gloups13 Voir le message
    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????
    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

    Code:
    preliminaire=rand(1),
    prems=c<preliminaire,
    deuze=find(prems),
    tresse=max(deuze),
    pareil=max(find(c<preliminaire))
    Edit: croisement & +1!
    Dernière modification par Jiav ; 20/02/2017 à 19h51.

  14. #44
    gloups13

    Re : programme tirant une boule parmi d'autres, pondéré avec des 'poids'

    Parfait.
    Avec ces trois liens j'ai tous compris.
    Merci beaucoup pour cette bonne pédagogie.
    CDT

  15. #45
    gloups13

    Re : programme tirant une boule parmi d'autres, pondéré avec des 'poids'

    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.

  16. #46
    invite73192618

    Re : programme tirant une boule parmi d'autres, pondéré avec des 'poids'

    Exactement.

  17. #47
    gloups13

    Re : programme tirant une boule parmi d'autres, pondéré avec des 'poids'

    ca veut dire que je suis au même niveau que lors de mon poste #1?
    ...

  18. #48
    Dlzlogic

    Re : programme tirant une boule parmi d'autres, pondéré avec des 'poids'

    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.

  19. #49
    invite73192618

    Re : programme tirant une boule parmi d'autres, pondéré avec des 'poids'

    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.

  20. #50
    gloups13

    Re : programme tirant une boule parmi d'autres, pondéré avec des 'poids'

    OK .
    Merci à tous pour votre aide. Pour ma part, je considère ce problème résolu
    Bonne journée.

  21. #51
    Evil.Saien

    Re : programme tirant une boule parmi d'autres, pondéré avec des 'poids'

    Citation Envoyé par gloups13 Voir le message
    OK .
    Merci à tous pour votre aide. Pour ma part, je considère ce problème résolu
    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

Page 2 sur 2 PremièrePremière 2

Discussions similaires

  1. Allumer une DEL parmi d'autres aléatoirement
    Par aj95 dans le forum Électronique
    Réponses: 19
    Dernier message: 27/02/2018, 18h05
  2. Une idée parmi tant d'autres
    Par invite6e69d4ca dans le forum Physique
    Réponses: 5
    Dernier message: 13/08/2005, 13h32