Algo de répartition homogène : casse tête

Nebuchad34Nebuchad34 Membre
11:21 modifié dans Vos applications #1
Bonsoir.

j'ai désespérément besoin d'aide.

Je me casse la tête pour essayer de mettre sur pate un algo avant de la programmer. c'est pas la joie !  :'(

En effet, je suis en train de concevoir un logiciel de gestion de tournois de poker, et je souhaiterai implémenter la gestion des tables. Pour commencer, il me faut répartir les joueurs de manière aléatoire et homogène sur les différentes tables. Je m'explique.

D'abord, je mélange ma liste de joueurs pour que la répartition se fasse au hasard. jusque là  je sais faire.
Avant de pouvoir répartir mes joueurs à  chaque tables, et bien j'ai besoin de connaà®tre deux paramètres : le nombre de tables et le nombre "utile" de joueurs par table. c'est tout l'objet de l'algo que je n'arrive pas à  sortir.

Ainsi, connaissant N le nombre de Joueurs, et MAX le nombre maximum de joueurs par table, j'ai besoin que l'algo me sorte le nombre de Tables nécessaires et le Nombre de joueur "utile" par table pour que la répartition soit homogène. (cà d a peu pret le même nbre de joueurs par table).

Voilà , j'espère avoir été clair (c'est pas facile cela dit  :adios!:), et si l'un de vous a une idée je suis preneur.

Merci.

Réponses

  • schlumschlum Membre
    décembre 2008 modifié #2
    Il manque un paramètre... Est-ce qu'il faut avoir le moins de tables possible ou pas ?

    Sinon c'est immédiat... N tables de 1 joueur  :o
  • Nebuchad34Nebuchad34 Membre
    11:21 modifié #3
    Oui, il faut avoir le moins de table possible.  :)
  • schlumschlum Membre
    décembre 2008 modifié #4
    Si tu veux minimiser le nombre de table, c'est :
    Division euclidienne -> N = a*MAX+b (b<MAX)
    Il y aura donc (a+1) tables au minimum

    Reste à  répartir les joueurs entre ces (a+1) tables
    Re division euclidienne N = k*(a+1)+l (l<(a+1))
    -> (a+1-l) tables de k joueurs
    -> l tables de (k+1) joueurs

    Comme k = MAX-1, ça donne :
    (a+1-l) tables de MAX-1 joueurs
    l tables de MAX joueurs
  • schlumschlum Membre
    11:21 modifié #5
    Exemple 156 joueurs avec au maximum 7 joueurs par table

    156 = 22*7+2
    -> 23 tables au minimum

    156 = 6*23+18

    -> 5 tables de 6 joueurs
    -> 18 tables de 7 joueurs
  • schlumschlum Membre
    11:21 modifié #6
    Nota : Il y a le cas particulier ou N est un multiple de MAX... Dans ce cas c'est immédiat, N/MAX tables de MAX joueurs

    Dans les autres cas, b est non nul, k = (MAX-1)
  • Nebuchad34Nebuchad34 Membre
    11:21 modifié #7
    euh...  ???

    je comprends pas tout. Comment je transforme ça en algo, si y'a division euclidienne y'aura forcément du modulo et du reste mais... ?

    j'avoue que j'ai du mal à  comprendre ce que tu as écrit, b et l sont les restes de la divisione euclidienen c ça ?

    EDIT : oups, t as continu à  poster entre temps poru exepliquer. Merci !
  • Nebuchad34Nebuchad34 Membre
    11:21 modifié #8
    Bon, il est tard et j'aimerai abuser de ton aide pour boucler ce truc avant d'aller me coucher. Comment je récupère facilement les valeurs de a,b, k et l. y'a des fonctions pour ça ?
  • schlumschlum Membre
    11:21 modifié #9
    * Si N%MAX == 0 -> N/MAX tables de MAX
    * Sinon
    a = N/MAX (division int)
    l = N%(a+1)
    ->a+1-l tables de MAX-1
    -> l tables de MAX
  • Nebuchad34Nebuchad34 Membre
    11:21 modifié #10
    Merci infiniment. Tu n'imagines pas le nombre de "si" imbriqués que j'avais fait pour des résultats hasardeux.
  • schlumschlum Membre
    décembre 2008 modifié #11
    J'ai dit une énorme bêtise, k ne vaut pas toujours MAX-1 !

    * Si N%MAX == 0 -> N/MAX tables de MAX
    * Sinon
    a = N/MAX (division int)
    k = N/(a+1) (division int)
    l = N%(a+1)
    ->a+1-l tables de k
    -> l tables de k+1


    Exemple, 156 avec des tables de 50 au max
    156 = 3*50+6
    a = 3
    156 = 39*4+0
    k = 39
    l = 0

    -> 4 tables de 39
    (un cas où le nombre de joueurs par table est bien inférieur à  MAX)

  • Nebuchad34Nebuchad34 Membre
    11:21 modifié #12
    Je suis littéralement bluffé. j'étais revenu pour signaler que justement il y avait un problème quand on était très inférieur au max.  :)

    Bravo, franchement bravo. Pour l'heure je vais me coucher. Mais je reviendrai sûrement demain te demander de m'aider à  gérer les balancements des joueurs d'une table à  l'autre. En effet, quand des joueurs sont éliminés il arrive un moment ou les tables sont déséquilibrés en nombre de joueurs.

    Mais c'est encore une autre paire de manche...  :crackboom:-

    En tout cas merci beaucoup. Je serais ravi, si tu le souhaite, de mettre ton pseudo (ou même ton vrai nom) dans les remerciements du "A propos" de mon programme. (que j'entends mettre en ligne en donationware dès que les tables sont gérés complètement, car tous le reste est fonctionnel).
  • schlumschlum Membre
    11:21 modifié #13
    dans 1228777211:

    Bravo, franchement bravo. Pour l'heure je vais me coucher. Mais je reviendrai sûrement demain te demander de m'aider à  gérer les balancements des joueurs d'une table à  l'autre. En effet, quand des joueurs sont éliminés il arrive un moment ou les tables sont déséquilibrés en nombre de joueurs.

    Mais c'est encore une autre paire de manche...  :crackboom:-


    Là  c'est très simple... Tu as soit le même nombre de joueurs à  chaque table, auquel cas on ne rééquilibre rien lors d'une élimination, soit des tables avec n joueurs et d'autres avec n+1 joueurs ; si un joueur se fait éliminer d'une table "n+1", on ne rééquilibre pas ; si un joueur se fait éliminer d'une table "n", on y déplace un joueur d'une table "n+1".
  • schlumschlum Membre
    11:21 modifié #14
    Note : On peut supprimer le test du cas N%MAX==0 en prenant directement comme nombre de tables :
    (N+MAX-1)/MAX
    (c'est plus élégant...)

    a = (N+MAX-1)/MAX (division int)
    k = N/a (division int)
    l = N%a
    ->a-l tables de k
    -> l tables de k+1
  • Nebuchad34Nebuchad34 Membre
    décembre 2008 modifié #15
    le résultat est-il le même ou amélioré dans ce cas ? je ne suis pas chez moi en ce moment je testerai ce soir. mais j'ai remarqué que parfois le résultat est perfectible.

    Par exemple, si tout bêtement j'ai 10 joueurs sur des tables de 8, il me sort 8 joueurs sur une table et 2 pommés sur l'autre  :)

    (à  noter qu'il n'y a pas de problème pour un grand nombre de table ça marche nicquel)


    EDIT : Et ça résoud le problème ! tu es vraiment énervant  :P

    Prof de maths ? chercheur ? Et dire que je fait des études d'ingénieur et que je bouffe des maths toute la journée. je fais peine à  voir.  :'(
  • schlumschlum Membre
    11:21 modifié #16
    dans 1228811470:

    Par exemple, si tout bêtement j'ai 10 joueurs sur des tables de 8, il me sort 8 joueurs sur une table et 2 pommés sur l'autre  :)


    ???

    Ancien algo :
    N = 10
    MAX = 8
    N%MAX != 0
    a =N/MAX = 10/8 = 1
    k = N/(a+1) = 10/2 = 5
    l = N%(a+1) = 10%2 = 0

    -> a+1-l tables de k -> 2 tables de 5
    -> l tables de k+1 -> 0 tables de 6

    Nouvel algo :
    N = 10
    MAX = 8
    a = (N+MAX-1)/MAX = 17/8 = 2
    k = N/a = 10/2 = 5
    l = N%a = 10%2 = 0

    -> a-l tables de k -> 2 tables de 5
    -> l tables de k+1 -> 0 tables de 6

    Les 2 donnent exactement le même résultat  ;)
    Le second a pour seul avantage d'éliminer le test de congruence du début !
  • schlumschlum Membre
    11:21 modifié #17
    dans 1228811470:

    Prof de maths ? chercheur ? Et dire que je fait des études d'ingénieur et que je bouffe des maths toute la journée. je fais peine à  voir.  :'(


    Non, juste ingénieur  :P
    Enfin c'est quand même mon métier de concevoir des algos  :)
  • Nebuchad34Nebuchad34 Membre
    décembre 2008 modifié #18
    "Enfin c'est quand même mon métier de concevoir des algos  "


    Ah ben je comprends mieux  ;)

    Bon, alors, pour gérer le balancement des joueurs. j'ai crée deux tableaux sur la base que tu m'a donné.
    Le premier "tablesK" contient les numéros des tables de k joueurs.
    Le deuxième "tablesKplusUn" contient les numéros des tables de k+1 joueurs.

    Ensuite, dès qu'un joueur est éliminé, je suis prévenu par un belle observation clé valeur que j'ai appris a faire dans le Aaron Hillgass. il va me falloir gérer plusieurs étapes et plusieurs cas.

    je récupére le nom du joueur éliminé. j'identifie le joueur sur une table en faisant une comparaison de nom, tout simplement. Ayant identifié le joueur je récupère son numéro de table.

    Ensuite, je cherche à  savoir si le numéro de table appartient au tableau "tablesK" ou "tablesKplusUn".

    Cas 1 : le joueur appartient à  tableKplusUn.
    ->je supprime le joueur de la table
    ->je supprime sa table de tableskplusun
    ->j'ajoute sa table à  tablesk

    Cas 2 : le joueur appartient à  tableK
    ->je supprime le joueur de la table
    ->je vérifie que tablesKplusUn n'est pas vide !
    Cas 2.1, tablesKplusUn est vide.
    ->tablesKplusUn = tablesK
    ->je retire la table du joueur de tablesK;
    ->tablesK =la table du joueur;
    Cas 2.2, tablesKplusUn n'est pas vide;
    ->choix aléatoire d'un joueur J d'une table K+1;
    ->suppression de J de sa table;
    ->ajout de sa précédente table à  tableK;
    ->ajout du joueur J à  la table à  K-1;

    Et, quand j'aurais réussi a faire un truc pareil, il faudra encore que j'arrive à  savoir quand il y a "une table en trop" et organiser une dispersion des joueurs d'une table vers toutes les autres d'un seul coup.

    Au secours :'(
  • schlumschlum Membre
    11:21 modifié #19
    dans 1228846747:

    Et, quand j'aurais réussi a faire un truc pareil, il faudra encore que j'arrive à  savoir quand il y a "une table en trop" et organiser une dispersion des joueurs d'une table vers toutes les autres d'un seul coup.

    Au secours :'(


    Si après avoir dégagé le joueur (même pas besoin de rééquilibrer), tu tombes sur N%MAX==0, tu as une table en trop
    Il faut alors vider une table (n'importe laquelle), et compléter toutes les autres avec à  MAX.
  • Nebuchad34Nebuchad34 Membre
    décembre 2008 modifié #20
    parfait merci je vais cogiter tout ça. En attendant, je te propose, si tu as leopard, de jeter un oeil à  l'appli en question. Au passage, tu pourra y admirer ton oeuvre dans l'onglet "Tables".

    Poker Manager 1.0 Beta 5


    NB : une fois les tables créées on peu appeler la liste directement depuis l'écran de jeu en cliquant sur l'icône représentant une table en haut à  gauche de l'écran.
Connectez-vous ou Inscrivez-vous pour répondre.