Organisation tournoi multisports avec 7 équipes
Fermémamiemando Messages postés 33432 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 16 décembre 2024 - 7 juil. 2023 à 15:42
- Tournoi 7 équipes excel
- Liste déroulante excel - Guide
- Si et excel - Guide
- Aller à la ligne excel - Guide
- Word et excel gratuit - Guide
- Telecharger photofiltre 7 gratuit - Télécharger - Retouche d'image
6 réponses
Tu dis que chaque équipe doit jouer au moins une fois contre chacune des autres? Faisons un petit diagramme avec une matrice diagonale:
La première ligne et la première colonne sont pour numéroter les équipes.
\ 1 2 3 4 5 6 7
1 *
2 1 *
3 1 2 *
4 1 2 3 *
5 1 2 3 4 *
6 1 2 3 4 5 *
7 1 2 3 4 5 6 *
L'astérisque est pour montrer qu'une équipe ne joue pas contre elle-même.
On voit qu'il y aura 21 parties en tout. On a 3 terrains. Donc chaque terrain sera utilisé 7 fois.
Et on répète pour chaquun des 6 sport.
Est-ce que ça répond à tes critères?
On place sur chaque terrain deux équipes qui ne sont pas sur un autre terrain (au début tous les terrains sont libres).
Et on efface chacune des 3 case après les parties.
On recommence tant qu'il y a des cases dans la matrice.
30 juin 2023 à 08:37
bonjour,
Tu as besoin de plus de 6 tours pour réaliser cela. En 6 tours, chaque équipe n'aura même pas joué 6 fois, donc n'aura pas rencontré chaque autre équipe. Ni joué à chaque sport.
Modifié le 5 juil. 2023 à 17:31
Bonjour,
Est-ce que le but est de trouver à chaque slot de temps quels matchs doivent être joués ? Le problème a bien entendu plein de symétries puisque à une renumérotation prête des équipes, on peut trouver un autre planning de matchs.
Le problème a évidemment une solution (dans le pire des cas, on peut faire à chaque slot de temps un seul match parmi ceux listés par pierrot, soit 21 slots de temps).
Si on omet la contrainte des terrains, pour résoudre le problème en moins de slots de temps, je pense qu'un algorithme glouton qui garde trace des matchs déjà joué est suffisant. Je suppose que chaque match dure un slot de temps.
- Match joués = {}
- t = 0
- Tant que |Match joués| != 21
- Réinitialiser équipes disponibles = {1, ..., 7}
- Pour i = 0 ... 6
- Si i n'est pas disponible
- Continuer
- Trouver une équipe disponible j telle que ni (i, j) ni (j, i) n'est pas dans Matchs joués
- Si j existe:
- Ajouter (i, j) -et/ou (j, i)- à Match joués : le match (i, j) est joué à l'instant t
- Retirer i et j des équipes disponibles
- i ++
- Si i n'est pas disponible
- t ++
Une fois que tu as décidé des matches, je pense que tu peux résoudre la problématique des jeux associés à chaque match dans un second temps.
Il est probable en tout cas sur cette instance qu'un algorithme glouton du même genre soit suffisant. Au pire du pire ton problème se résout avec un ILP (Integer Linear Program) ou un CSP (Constraint Satisfaction Program), mais cela présuppose que tu as des notions en recherche opérationnelle (la branche des maths qui s'occupe des problèmes d'optimisation).
Bonne chance
5 juil. 2023 à 18:02
Cette solution néglige la complexité du problème posé: "chaque équipe participe au moins une fois à chaque sport".
De toute évidence, cela requiert plus de 21 parties. Chaque sport devant minimum être joué 4 fois, il faut au minimum 24 parties.
Par ailleurs, la solution introduit une contrainte qui n'était pas dans l'énoncé: rien n'interdit à deux équipes de jouer plusieurs fois ensemble. Heureusement, sinon il n'y aurait pas de solution.
6 juil. 2023 à 13:14
Effectivement, 21 slots de temps ne seront pas suffisant car comme on a un nombre équipe impair, une équipe devra rejouer un sport pour affronter la 7e, ce qui fait effectivement 4 rencontres par sport, et comme il y a 6 sports cela fait 24 rencontres. Ceci dit une je pense qu'on peut quand même repartir de la solution de l'algorithme glouton pour rajouter quelques matches supplémentaires pour que chaque "7e" fasse son sport. Comme il y a 6 sports et 3 terrains cela fait 2 slots de temps supplémentaires.
On est tous d'accord qu'il faut plus de 6 "tours" pour jouer toutes les parties pour les 6 sports en question.
On peut le voir comme un problème d'analyse combinatoire.
Une équipe ne peut pas jouer contre elle-même. L'équipe A ne peut pas jouer contre A.
De même, il y a symétrie. Si A joue contre B, c'est la même chose de dire que B joue contre A.
Il faut donc calculer le nombre de combinaisons de 2 valeurs parmi N (ici N vaut 7).
C(7, 2) vaut justement 21 (7!/(5!2!) )
On peut faire une liste de ces paires de nombres et faire en sorte qu'il n'y ait pas deux fois la même paire (ou son équivalent).
Suivant le langage utilisé, on pourrait avoir une liste de tuples ou un tableau 2D donnant ainsi les paires.
Ici, on est chanceux, 21 se divise justement par 3. On peut parcourir la liste et assigner les équipes par groupes de 3 paires.
Cela fera exactement 7 tours de 3 parties ou terrains. Et on recommence pour chaque sport. Donc au total 21*6 = 126 parties ou 42 tours complets.
Supposons que le nombre d'équipes soit de 8 au lieu de 7.
Le nombre de combinaisons sera donc C(8, 2) = (8!/(6!2!) ) = 28, qui ne se divise pas par 3.
On peut faire comme pour l'autre liste en assignant une paire à chaque terrain par groupe de 3 paires.
Cela fera 27 paires groupées par 3. donc 9 tours.
Et que fait-on avec la 28ième paire?
On la place sur le premier terrain et on retourne au début de la liste mais on passe au sport suivant.
On aura virtuellement une liste de 28*6 (168) parties-paires, donc 168/3 = 56 ttours complets.
Si le nombre de sports était de 7 au lieu de 6, on aurait au total 28*7 = 196 parties-paires.
Dans ce cas, on aurait 65 tours complets avec 3 terrains et un tour avec un seul terrain.
6 juil. 2023 à 08:33
Attention, l'énoncé indique que chaque équipe doit participer au moins une fois à chaque sport.
Cela n'implique pas que chaque paire d'équipes doit jouer à tous les sports.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre questionModifié le 6 juil. 2023 à 14:33
Bonjour,
Je vous propose cette formulation ILP que j'espère complète et correcte. On définit T_max a priori (par exemple 24) et on regarde si le solveur trouve une solution, sinon on augmente T_max.
Notations : (je donne les domaines de définition ici ; pour alléger les notations, je ne les rappellerai donc ni dans les sommes, ni les quantificateurs des contraintes puisque ce sont implicitement toujours les mêmes):
- i, j: les indices des équipes dans {1...7}
- k: les indices des sports à valeur dans {1...6}
- t: les indices du temps à valeur dans {1...T_max}
Variables de décisions (pour chaque valeur de i, j, k, t) :
- Xijt : les équipes i et j se rencontrent au temps t pour faire le sport k, à valeur dans {0, 1}
- Yikt : l'équipe i joue au sport k au temps t, à valeur dans {0, 1}
Fonction objectif :
- min sum_t sum_i sum(i <j) Xijt // Minimiser le nombre de rencontres (on veut éviter que des paires d'équipe (i, j) se rencontrent plusieurs fois "pour le fun")
Contraintes (linéaires) :
- Xiit = 0 // L'équipe i ne peut pas se rencontrer elle-même
- Pour tout i, pour tout j != i, pour tout t : Xijt = Xjit // Si i rencontre j au temps t, alors l'équipe j rencontre i au temps t également
- Pour tout i, sum_k Yikt <= 1 // Chaque équipe i joue à au plus un sport au temps t
- Pour tout i, pour tout j != i, pour tout k : Yikt + Yijt >= 2 * Xijt // Si i et j se rencontrent à l'instant t, alors elles pratiquent toutes les deux le sport k
- Pour tout t: sum_i sum_(i<j) Xijt <= 3 // Au plus 3 rencontres à chaque temps t
- Pour tout i, pour tout t: sum_k Yikt <= 1 // Chaque équipe i joue à au plus 1 sport à chaque instant t
- Pour tout i: sum_t sum_k Yikt >= 6 // Chaque équipe i joue aux 6 sports
Implémentation
D'un point de vue pratique, il existe de nombreux solveurs ILP. En python par exemple, scipy fournit une fonction pour résoudre un MILP (donc un ILP), à savoir scipy.optimize.milp.
Il existent de nombreux autres solveurs, pas seulement en python. Parmi les plus connus, on peut notamment citer Ilog Cplex (payant), Coin-OR (équivalent de Cplex libre) utilisables en C++ et en Java.
Remarques
On peut probablement faire quelques relaxations linéaires (par exemple dire que les Xijt et/ou les Yikt sont dans [0, 1] au lieu de {0, 1}) afin de réduire le nombre de variables entières (qui deviennent de facto continue) et ainsi accélérer significativement la résolution. On espère en faisant une telle relaxation toujours trouver une solution entière (si ça n'est pas le cas, on les repasse dans le domaine discret). Ça vaut alors le coup de regarder scipy.optimize.linprog.
Bonne chance
6 juil. 2023 à 15:29
Je pense qu'il y a des contraintes non strictement nécessaires, et je suppose que cela ne nuit pas à la solution.
Par contre, ne manque-t-il pas les deux contraintes les plus importantes?
- que chaque équipe doit rencontrer chaque autre équipe?
- que chaque équipe doit jouer à chaque sport?
- pour tout i, sum_k min(1, sum_t Yikt) = 6
- pour tout i, sum_j min(1, sum_t Xijt) = 6
6 juil. 2023 à 15:39
24, c'était le nombre minimum de rencontres, pas de slot de temps, non?
Modifié le 6 juil. 2023 à 21:01
- #10 : Oui tu as raison, mais bref on choisit a priori la valeur de T (24 est effectivement le nombre de rencontre et est donc clairement excessif) et ensuite on résout le problème (puis on répète en réduisant progressivement T). Visiblement d'après #11, T=8 est un choix qui permet de trouver une solution. Si le problème d'optimisation est correct, on peut voir si on trouve quelque chose avec de plus petites valeurs de T.
- #9 : En effet, il manque quelques contraintes. Celles que tu proposent sont correctes mais ne sont pas encore linéarisées. Pour les linéariser, on peut introduire quelques variables muettes, normalement à valeur dans {0, 1} -- mais qu'on peut clairement relaxer dans [0, 1]. Sauf erreur de ma part, il faudrait alors ajouter à la formulation précédente les éléments suivants.
- Variables et paramètres :
- Mij est la variable (muette) indique que l'équipe i a joué au moins une fois contre l'équipe j au cours du tournoi, à valeur dans {0, 1}
- M = 7 est le nombre d'équipes
- Nik est le variable (muette) indique que l'équipe i a joué au moins une fois au sport k au cours du tournoi, à valeur dans {0, 1}
- N = 6 est le nombre de sports
- Contraintes linéarisées :
- Pour tout i, pour tout j !=i, Mij >= sum_t (Xijt) / T
- Pour tout i, sum_j Mij = M - 1 // L'équipe à rencontrer les M-1 équipes adverses
- Pour tout i, pour tout k, Nik >= sum_t (Yikt) / T
- Pour tout i, sum_j Nij = N // L'équipe à rencontrer les M-1 équipes adverses
- Variables et paramètres :
Encore merci pour tes remarques !
7 juil. 2023 à 08:57
Deux contraintes manquantes, je pense:
- Pour tout i, pour tout j !=i, Mij <= sum_t (Xijt)
- Pour tout i, pour tout k, Nik <= sum_t (Yikt)
Je dois avouer que j'étais curieux (sceptique) quant à la possibilité de linéariser cela. C'est vrai que l'utilisation d'inégalités offrent beaucoup de possibilités.
Modifié le 7 juil. 2023 à 13:26
Bonjour yg_be, ces deux inégalités ne sont pas utiles car Mij et Nik sont à valeur dans {0, 1}, du coup les contraintes induites par les domaine de définition de ces variables est déjà plus fort que les deux jeux de contraintes que tu évoques. Merci toutefois pour ton retour :-)
6 juil. 2023 à 18:51
Voici un exemple de comment organiser ce tournoi en 24 parties, donc en 8 tours:
Au tour 0, les équipes 0 et 1 jouent au jeu 0.
Au tour 0, les équipes 2 et 3 jouent au jeu 0.
Au tour 0, les équipes 4 et 5 jouent au jeu 0.
Au tour 1, les équipes 1 et 2 jouent au jeu 1.
Au tour 1, les équipes 3 et 4 jouent au jeu 1.
Au tour 1, les équipes 5 et 6 jouent au jeu 1.
Au tour 2, les équipes 0 et 2 jouent au jeu 2.
Au tour 2, les équipes 1 et 3 jouent au jeu 2.
Au tour 2, les équipes 4 et 6 jouent au jeu 2.
Au tour 3, les équipes 0 et 3 jouent au jeu 3.
Au tour 3, les équipes 1 et 6 jouent au jeu 3.
Au tour 3, les équipes 2 et 5 jouent au jeu 3.
Au tour 4, les équipes 0 et 4 jouent au jeu 4.
Au tour 4, les équipes 1 et 5 jouent au jeu 4.
Au tour 4, les équipes 3 et 6 jouent au jeu 4.
Au tour 5, les équipes 0 et 5 jouent au jeu 5.
Au tour 5, les équipes 1 et 4 jouent au jeu 5.
Au tour 5, les équipes 2 et 6 jouent au jeu 5.
Au tour 6, les équipes 0 et 6 jouent au jeu 0.
Au tour 6, les équipes 2 et 4 jouent au jeu 4.
Au tour 6, les équipes 3 et 5 jouent au jeu 5.
Au tour 7, les équipes 0 et 6 jouent au jeu 1.
Au tour 7, les équipes 2 et 4 jouent au jeu 3.
Au tour 7, les équipes 3 et 5 jouent au jeu 2.