Bonjour, cliquez-ici pour vous inscrire et participer au forum.
  • Login:



+ Répondre à la discussion
Page 1 sur 4 12 3 DernièreDernière
Affichage des résultats 1 à 15 sur 51

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

  1. gloups13

    Date d'inscription
    juin 2012
    Localisation
    Marseille
    Messages
    199

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

    Bonsoir,
    Je rencontre actuellement un problème qui, à première vue, pourrait paraître simple mais en y réfléchissant bien, n'est pas si simple que ça.
    Je vous l'explique:
    J'ai une matrice B de 1 ligne et 190 colonnes.
    Dans chaque colonne, il y a une probabilité. Les probabilités sont rangées par ordre croissant dans B.
    J'aimerai faire un programme qui me sélectionne une colonne de B en tenant compte de la probabilité de sélectionner une colonne (probabilité qui est inscrite dans B.
    J'ai essayé de modéliser les cases de B par des boules et de tirer une boule parmi les 190 en tenant compte de leurs poids. ça n'a pas marché.
    J'ai essayé de convertir les probabilité en angle pour utiliser une roue comme il y a dans les casinos, ça a été un échec. Je sais vraiment pas comment faire. Si vous avez une idée.
    Remarque: j'ai des probabilités très petites: ça va de 10-8 à10-2
    J'utilise Scilab pour coder.
    Merci de votre aide.
    CDT

    -----

     


    • Publicité



  2. Evil.Saien

    Date d'inscription
    janvier 2003
    Localisation
    Montreal
    Âge
    35
    Messages
    1 389

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

    Salut,

    C'est quoi ton code actuel qui ne marche pas ?

    Bon, peut-être que tu veux explorer une nouvelle piste. T'as une idée de par où commencer ?
    Mon psychiatre, pour quinze mille francs, il m'a débarrassé de ce que j'avais : quinze mille francs
     

  3. gloups13

    Date d'inscription
    juin 2012
    Localisation
    Marseille
    Messages
    199

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

    Bonsoir, alors voici le programme
    Ici ce programme ne marche même pas alors que la matrice qui contient les probabilité (ici la matrice P) est de taille petite.


    Code:
    P=[3/6, 2/6, 1/6];//Matrice qui contient la probabilité de tirer le chromosome 1, 2, 3...N
    I=[];
    ADN_next=zeros(N,tc);
    for i=1:N-1
        for j=i+1:N
            p=P(1,i)*P(1,j)*(1/(1-P(1,i))+1/(1-P(1,j)));//Probabilité de séléctionner les chromosomes i et j.
            teta=fix(360*p);
            B=10*(i+j/10);// Noyau du programme.ici, B n'est rien d'autre que le nombre ij (c'est pas i*j)!!!!
            I=[I,B*ones(1,teta)];//I est la roue biaisée du casino. 
        end
    end

    et le résultat:
    Code:
             column 1 to 12
    
       12.   12.   12.   12.   12.   12.   12.   12.   12.   12.   12.   12.
    
             column 13 to 24
    
       12.   12.   12.   12.   12.   12.   12.   12.   12.   12.   12.   12.
    
             column 25 to 36
    
       12.   12.   12.   12.   12.   12.   12.   12.   12.   12.   12.   12.
    
             column 37 to 48
    
       12.   12.   12.   12.   12.   12.   12.   12.   12.   12.   12.   12.
    
             column 49 to 60
    
       12.   12.   12.   12.   12.   12.   12.   12.   12.   12.   12.   12.
    
             column 61 to 72
    
       12.   12.   12.   12.   12.   12.   12.   12.   12.   12.   12.   12.
    
             column 73 to 84
    
       12.   12.   12.   12.   12.   12.   12.   12.   12.   12.   12.   12.
    
             column 85 to 96
    
       12.   12.   12.   12.   12.   12.   12.   12.   12.   12.   12.   12.
    
             column 97 to 108
    
       12.   12.   12.   12.   12.   12.   12.   12.   12.   12.   12.   12.
    
             column 109 to 120
    
       12.   12.   12.   12.   12.   12.   12.   12.   12.   12.   12.   12.
    
             column 121 to 132
    
       12.   12.   12.   12.   12.   12.   12.   12.   12.   12.   12.   12.
    
             column 133 to 144
    
       12.   12.   12.   12.   12.   12.   12.   12.   12.   12.   12.   12.
    
             column 145 to 156
    
       12.   12.   12.   12.   12.   12.   12.   12.   12.   12.   12.   12.
    
             column 157 to 168
    
       12.   12.   12.   12.   12.   12.   12.   12.   12.   12.   12.   12.
    
             column 169 to 180
    
       12.   12.   12.   12.   12.   12.   12.   12.   12.   12.   12.   12.
    
             column 181 to 192
    
       12.   12.   12.   12.   12.   12.   12.   12.   12.   12.   12.   12.
    
             column 193 to 204
    
       12.   12.   12.   12.   12.   12.   12.   12.   12.   12.   12.   12.
    
             column 205 to 216
    
       12.   12.   12.   12.   12.   13.   13.   13.   13.   13.   13.   13.
    
             column 217 to 228
    
       13.   13.   13.   13.   13.   13.   13.   13.   13.   13.   13.   13.
    
             column 229 to 240
    
       13.   13.   13.   13.   13.   13.   13.   13.   13.   13.   13.   13.
    
             column 241 to 252
    
       13.   13.   13.   13.   13.   13.   13.   13.   13.   13.   13.   13.
    
             column 253 to 264
    
       13.   13.   13.   13.   13.   13.   13.   13.   13.   13.   13.   13.
    
             column 265 to 276
    
       13.   13.   13.   13.   13.   13.   13.   13.   13.   13.   13.   13.
    
             column 277 to 288
    
       13.   13.   13.   13.   13.   13.   13.   13.   13.   13.   13.   13.
    
             column 289 to 300
    
       13.   13.   13.   13.   13.   13.   13.   13.   13.   13.   13.   13.
    
             column 301 to 312
    
       13.   13.   13.   13.   13.   23.   23.   23.   23.   23.   23.   23.
    
             column 313 to 324
    
       23.   23.   23.   23.   23.   23.   23.   23.   23.   23.   23.   23.
    
             column 325 to 336
    
       23.   23.   23.   23.   23.   23.   23.   23.   23.   23.   23.   23.
    
             column 337 to 348
    
       23.   23.   23.   23.   23.   23.   23.   23.   23.   23.   23.   23.
    
             column 349 to 358
    
       23.   23.   23.   23.   23.   23.   23.   23.   23.   23.
    remarquez que I n'a même pas 360 colonnes. C'est du au f que les p sont trop petits.

    C'est difficile de comprendre ce que j'ai fait. En fait, dans I il y a un nombre (par exemple 23) cela veut dire que si en générant aléatoirement un nombre entier (compris entre 1 et 358), par exemple 350, je sélectionne la 350ème colonne de I et je relève sa valeur: ici '23' alors le chromosome 2 et 3 ont étaient sélectionnés.
    Ensuite, comme j'ai dis qu'il y avait des poids, j'ai représentais ces poids aves un nombre de colonne déterminé qui comportent le même nombre.

    Dans ce cas j'ai que 3 chromosomes et ça ne marche pas bien.
    Hors ce cas est un exemple, dans mon projet j'ai beaucoup plus de chromosomes alors cette méthode ne marchera vraiment pas.
    Je sais pas trop comment faire
     

  4. Evil.Saien

    Date d'inscription
    janvier 2003
    Localisation
    Montreal
    Âge
    35
    Messages
    1 389

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

    Commençons simple.

    Admettons que tu as 2 boules. La probabilité de tirer la boule A est pA et celle de la boule B est pB (=1-pA).

    Comment tu ferais pour faire un tirage pondéré ?
    Mon psychiatre, pour quinze mille francs, il m'a débarrassé de ce que j'avais : quinze mille francs
     

  5. gloups13

    Date d'inscription
    juin 2012
    Localisation
    Marseille
    Messages
    199

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

    Alors soit PA=0.7 et PB=0.3
    Je crée la matrice I=[1 1 1 1 1 1 1 2 2 2 ]
    Je génère un nombre entier aléatoire entre 1 et 10
    Si le nombre généré aléatoirement vaut, par exemple, 4 alors je sélectionne I(1,4) qui vaut 1 ce qui veut dire que la boule A a été tirée.
    Cette méthode ne marche plus quand ya beaucoup de boules avec des probabilités très petites.
     


    • Publicité



  6. Evil.Saien

    Date d'inscription
    janvier 2003
    Localisation
    Montreal
    Âge
    35
    Messages
    1 389

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

    Ok, t'as le principe.

    Maintenant essaie de le généraliser avec n'importe quels pA et pB (a priori inconnus, on sait juste que pA >= 0, pB >=0, pA+pB=1)
    Mon psychiatre, pour quinze mille francs, il m'a débarrassé de ce que j'avais : quinze mille francs
     

  7. gloups13

    Date d'inscription
    juin 2012
    Localisation
    Marseille
    Messages
    199

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

    Al là je n'y arrive pas. Car si PA=10-8 ,comment faire un programme qui tienne compte de ce cas. Je vois pas comment faire.
     

  8. Evil.Saien

    Date d'inscription
    janvier 2003
    Localisation
    Montreal
    Âge
    35
    Messages
    1 389

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

    Oui je comprends que tu n'y arrives pas, parce que tu énumères explicitement les possibilités.

    Et si tu oubliais ta matrice I pour raisonner par intervalles...
    Mon psychiatre, pour quinze mille francs, il m'a débarrassé de ce que j'avais : quinze mille francs
     

  9. gloups13

    Date d'inscription
    juin 2012
    Localisation
    Marseille
    Messages
    199

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

    comme je l'ai dit, j'ai beaucoup cherché avant de poster cette question. J'ai essayé les intervalles mais si j'ai un intervalle IA=[0,PA] et IB=[PA,1[
    Si je génère un nombre aléatoire entre 0 et 1 alors je ne tiens plus compte du fait que les boules sont pondérées Car la probabilité de tirer un nombre dans l'un des deux intervalle est la même car tous les deux comportent une infinité de nombre.
     

  10. Dlzlogic

    Date d'inscription
    juillet 2011
    Messages
    2 270

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

    Bonsoir,
    Il y a aussi un point important qui semble oublié : la somme des probabilités des 190 boules doit être égale à 1, c'est à dire 100%.
    Pour ce type de problème, j'avais conseillé la création de classes.
    Encore une fois, pardon si je me répète, si on s'obnubile sur la méthode de résolution avant d'avoir posé le problème, on a peu de chance d'y arriver.
     

  11. gloups13

    Date d'inscription
    juin 2012
    Localisation
    Marseille
    Messages
    199

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

    Bonsoir,
    Pas d'inquiétude, aussi petites quelle soit, la somme de toutes les probabilités fait bien 1
    Ensuite, je ne rejette aucune méthode. Vous dites avoir évoqué la création de classe. Je vais aller revoir ce que vous avez dit sur ce sujet. Mais les classe en Scilab, je ne crois pas que ça existe.
    Bref, c'est pas simple cette histoire.
     

  12. Dlzlogic

    Date d'inscription
    juillet 2011
    Messages
    2 270

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

    Le terme de "classe" n'a rien à voir avec les classes des logiciels modernes.
    Oubliez l'informatique, écrivez l'algorithme, c'est à dire la logique de ce que vous voulez faire, il sera bien temps, ensuite, de le traduire en code, dans votre langage préféré.
     

  13. Evil.Saien

    Date d'inscription
    janvier 2003
    Localisation
    Montreal
    Âge
    35
    Messages
    1 389

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

    Citation Envoyé par gloups13 Voir le message
    comme je l'ai dit, j'ai beaucoup cherché avant de poster cette question. J'ai essayé les intervalles mais si j'ai un intervalle IA=[0,PA] et IB=[PA,1[
    Si je génère un nombre aléatoire entre 0 et 1 alors je ne tiens plus compte du fait que les boules sont pondérées Car la probabilité de tirer un nombre dans l'un des deux intervalle est la même car tous les deux comportent une infinité de nombre.
    Ce n'est pas parce qu'il existe une bijection entre [0 1e-36] et [0.5 1] qu'il y a autant de chances qu'un nombre choisi aléatoirement entre 0 et 1 ait autant de chances de se trouver dans chacun des intervales.

    Petite démonstration: prenons A un réel nombre choisi aléatoirement dans [0 1] selon une distribution uniforme. T'es d'accord pour dir que p(A<=0.5) = 0.5, et p(A>=0.5) = 0.5.
    Maintenant, disons que A>0.5, selon le même principe, on a p(A>=0.75|A>=0.5) = 0.5 et p(A<=0.75|A>0.5) = 0.5.

    Au final, qu'elle est la probabilité que A > 0.75 ? Selon le théorème de Bayes:
    p(A>=0.75|A>=0.5)*p(A>=0.5) = p(A>=0.5|A>=0.75)*p(A>=0.75)

    On voit clairement que p(A>=0.5|A>=0.75) = 1, d'où:
    p(A>=0.75) = p(A>=0.75|A>=0.5)*p(A>=0.5) = 0.5*0.5 = 0.25

    Donc, bien que l'interval [0.75 1] ait autant d'éléments que [0 0.75], A a 25% de chance de s'y trouver. Tu noteras que la probabilité de 0.25 est égale à la longueur de [0.75 1] et que ce n'est pas le fruit du hasard.
    Mon psychiatre, pour quinze mille francs, il m'a débarrassé de ce que j'avais : quinze mille francs
     

  14. Dlzlogic

    Date d'inscription
    juillet 2011
    Messages
    2 270

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

    @ Evil,
    C'est vraiment casse-cou ce que tu expliques.
    D'abord, le seul moyen de tirage direct que je connaisse avec une machine, est le résultat de la fonction rand. C'est à dire que c'est un tirage aléatoire, uniformément distribué et qui satisfait aux lois des probabilités.
    D'autre part, je ne vois pas ce que vient faire Bayes dans l'histoire. Comment utiliser "sachant que", qui sait quoi ?
    Il me parait indispensable que notre ami sache que si on fait un tirage entre 0 et 1, la probabilité d'avoir un résultat de l'ordre de 0.1 est exactement la même que celle d'avoir un résultat de l'ordre de 0.9, ou d'avoir un résultat de l'ordre de 0.6.
     

  15. Jiav

    Date d'inscription
    juillet 2004
    Messages
    8 219

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

    +1

    Autrement dit, tout ce que tu as besoin de faire est de creer un vecteur contenant les bornes, puis de tirer au hasard entre 0 et 1, et finalement de trouver la borne correspondante. Le tout se fait en quelques lignes.

    Code:
    c(1)=0; for i=1:190; c(1+i)=b(i)+c(i); end; 
    disp(max(find(c<rand(1)))
    A noter que, dependant de ce que tu veux faire quand ca tombe sur une borne, tu pourrais choisir min et > plutot que max et < a la derniere ligne.
    The opposite of a deep truth may well be another deep truth. Information is physical.
     


    • Publicité




Poursuivez votre recherche :




Sur le même thème :




 

Discussions similaires

  1. Allumer une DEL parmi d'autres aléatoirement
    Par aj95 dans le forum Électronique
    Réponses: 17
    Dernier message: 12/10/2008, 10h34
  2. Actu - Robot à la crèche : un enfant parmi d'autres
    Par RSSBot dans le forum Commentez les actus, dossiers et définitions
    Réponses: 4
    Dernier message: 14/01/2008, 05h14
  3. Une idée parmi tant d'autres
    Par maxdangers dans le forum Physique
    Réponses: 5
    Dernier message: 13/08/2005, 13h32