Algo de répartition homogène : casse tête
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.
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.
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Sinon c'est immédiat... N tables de 1 joueur
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
156 = 22*7+2
-> 23 tables au minimum
156 = 6*23+18
-> 5 tables de 6 joueurs
-> 18 tables de 7 joueurs
Dans les autres cas, b est non nul, k = (MAX-1)
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 !
* Sinon
a = N/MAX (division int)
l = N%(a+1)
->a+1-l tables de MAX-1
-> l tables de MAX
* 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)
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).
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".
(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
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.
???
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 !
Non, juste ingénieur :P
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
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.
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.