Algorithme round-robin badminton.
1. Round-robin classique vs round-robin pondéré
Le round-robin classique(« chacun rencontre chacun ») marche bien pour 8-10 joueurs en simple sur 1 terrain : tu fais 1 match par tour, tu enchaînes 7 ou 9 tours, c'est terminé. Au-delà, ou en double, ou avec plusieurs terrains, le format pur devient inadéquat — tu finis à 28 tours pour faire jouer 8 joueurs en doubles, et personne ne reste 4 heures au gymnase.
Le round-robin pondéré(celui qu'utilise Shuttle Planner et la plupart des organisateurs de soirée club) relâche la contrainte « chacun rencontre chacun » pour optimiser plusieurs choses en parallèle :
- Tout le monde joue à peu près le même nombre de fois (±1 match d'écart sur la soirée)
- Personne ne joue 2 fois d'affilée sans repos
- Sur la durée, chaque joueur croise un maximum de partenaires et d'adversaires différents
- Optionnellement : niveaux croisés / matchs serrés en niveau
2. Les 4 contraintes à arbitrer en même temps
Tout l'art (et la difficulté) du round-robin pondéré tient dans le fait que les 4 contraintes ci-dessous sont en tension : optimiser une seule au détriment des autres donne une grille bancale.
- Équilibre des matchs joués. Sur 20 joueurs et 4 terrains × 6 tours, tu as 6 × 4 × 4 = 96 places de joueur. Soit 4.8 matchs en moyenne par joueur. Une bonne grille a un écart-type proche de 0 (tout le monde à 4 ou 5). Une mauvaise grille a un joueur à 7 et un autre à 2.
- Repos entre matchs. Idéalement chaque joueur a au moins 1 tour de repos après 2 matchs consécutifs. Si tu ignores cette contrainte, un joueur peut enchaîner 5 matchs d'affilée et finir cuit en milieu de soirée.
- Variété partenaires / adversaires. Quand Marie joue 2 fois en partenariat avec Tom, c'est OK. Quand elle joue 4 fois sur 5 matchs en partenariat avec Tom, elle a l'impression qu'on lui force la main. La grille doit pénaliser doucement les paires déjà-vues.
- Niveau croisé. 21-3 entre un R6 et un débutant découverte ne fait plaisir à personne. Le matching de niveau (ou la mixité contrôlée) évite ces matchs déséquilibrés.
3. Pourquoi Excel craque à partir de 16 joueurs
Si tu as 12 joueurs sur 2 terrains × 5 tours, tu peux probablement composer une grille correcte à la main en 20 minutes. Tu fais 5 tours de 4 joueurs par terrain × 2 terrains = 40 places. 40 / 12 ≈ 3.3 matchs / joueur. Faisable.
À 16 joueurs sur 4 terrains × 6 tours, ça devient méchamment plus dur. 6 × 4 × 4 = 96 places. 96 / 16 = 6 matchs / joueur. Mais le nombre de combinaisons possibles de matchs explose : pour 16 joueurs, le nombre de combinaisons de 4 (matchs de double) vaut C(16,4) × C(12,4) × C(8,4) × C(4,4) = 1820 × 495 × 70 × 1 = 63 millions de répartitions possibles juste pour le premier tour. Et tu en as 6 à enchaîner.
Tu ne peux pas explorer toutes les combinaisons à la main. Tu vas appliquer des heuristiques :
- Trier les joueurs par « moins joué » à chaque tour
- Faire passer en priorité ceux qui n'ont pas joué le tour précédent
- Éviter de remettre les mêmes paires
- Préférer croiser les niveaux ou les grouper, selon ton objectif
C'est exactement ce que fait notre générateur round-robin gratuit en moins d'une seconde, pour 8 à 30 joueurs sur 1 à 8 terrains.
4. Les heuristiques classiques (et leurs limites)
Trois approches éprouvées dans la littérature des tournois internes amateurs, par ordre de complexité croissante :
- Méthode du cercle(round-robin pur). Tu places les joueurs sur un cercle, tu fixes le premier, tu fais tourner les autres d'un cran à chaque tour. Génial pour les rotations équilibrées en simple. Inadapté pour gérer le repos et la variété en doubles multi-terrains.
- Greedy avec sort(ce que fait notre outil). À chaque tour : tu sors les joueurs les moins-joués, tu les assignes aux terrains en fonction de ton critère (niveau, random pondéré), tu enregistres les compteurs. Linéaire en (nb joueurs × nb tours), donc instantané même à 30 joueurs. Limite : la décision est locale (tour par tour), donc l' optimal global n'est pas garanti.
- Recuit simulé / recherche locale. Tu pars d'une grille greedy, tu calcules un score global (somme des pénalités sur repos, variété, niveau), et tu échanges des joueurs entre matchs pour faire baisser le score, en acceptant occasionnellement des swaps qui le font monter pour échapper aux minima locaux. Donne des grilles quasi-optimales mais coûteux en CPU et difficile à expliquer au capitaine qui veut savoir pourquoi Marie joue 5 fois et Tom 4.
5. Le cas spécifique du badminton de club
La littérature des algos de round-robin (échecs, tennis, baseball) ne traite pas exactement les contraintes du badminton de club français :
- Doubles principalement (4 joueurs par terrain), pas simples. Multiplie la combinatoire de chaque match.
- Niveaux FFBaD très étendus (NC, P, P+, D, R, N — 6 paliers) qui se côtoient sur une même soirée loisirs. Le matching de niveau devient critique.
- Préférences sociales. Marie veut jouer avec son mari une fois, Léa préfère éviter Paul, le débutant Hugo doit jouer avec un joueur encadrant. Aucun algo de tournoi standard ne modélise ça nativement.
- Hot changes. Le joueur qui se désiste à 19h45, les terrains qui passent de 4 à 3 parce qu'un est inutilisable, la rencontre qu'on doit raccourcir de 30 minutes. La grille doit pouvoir se regénérer à partir du tour en cours sans casser l'historique des matchs déjà joués.
C'est précisément ce que Shuttle Planner modélise dans son algo de production : règles configurables (`SIMILAR_LEVEL`, `MATCHING_PREFS`, `MOST_RESTED`, `VARIOUS_MEET`), pipeline de composition tour par tour, regen après hot change. Le code source est public et la doctrine algo est documentée — c'est l'outil construit spécifiquement pour les capitaines bénévoles français.