générer combinaisons sans répétition et sans doublons pour tournois sportifs

leonfort2

XLDnaute Nouveau
Bonjour,
j'organise de plus en plus de tournois sportifs avec 5 équipes de 4 joueurs (total 20) sur 5 ou 6 rencontres.
La contrainte et l'esprit du tournoi est de ne pas faire jouer les mêmes personnes 2 fois au cours des 5 ou 6 rencontres. Jusqu'ici je fais à la main. Mais comme cela devient de plus en plus fréquent et que je suis pris par la préparation du tournoi (logistique, prix, etc.) j'aimerai pourvoir automatiser la génération de la liste des participants.
Les macro trouvée sur internet sur les combinaisons sont très bien. Comme Ce lien n'existe plus ou autres.
Seulement ce que je cherche c'est : j'ai 20 participants et des rencontres de 4 joueurs, donc 5 départs à donner.
Premier jour
A B C D
E F G H
I J K L
L M N O
P Q R S


Deuxième jour
A E I L
P B F J
M Q C G
K N R D
H L O S

Troisième jour
etc.
Cela doit permettre à un joueur de rencontrer tous les autres, peut-être pas tous vu le nombre de combinaisons possibles mais au moins sans rencontrer 2 fois la même personne.

Et si cela est faisable à la main sur 5 jours, cela devient fastidieux sur une année.
Le classement final est basé sur un score individuel vis à vis de tous les adversaires, d'où la nécessité de ne pas rencontrer 2 fois le même concurrent au cours de l'année.

J'ai trouvé une macro VB pour lister des combinaison et permutations que je ne sais pas adapter à mon besoin.
Est-ce que quelqu'un de plus expérimenté pourrait en faire des modifications pour résoudre mon besoin ?
Ou bien me proposer un autre outil.
Si bien sûr il est clairement exprimé.
Merci d'avance
Leonfort

Voici la macro VB dont je vous aiparlé plus haut
'Voici une diabolique procédure pour mettre
'définitivement fin aux questions concernant les
'listes de combinaisons ou de permutations
'de R éléments choisis parmi N.
'Pour l 'utiliser :
'1. En A1, écrire c ou p ; (Combinaison ou Permutation)
'2. En A2, écrire la valeur de R ;
'3. Sous A2, écrire la liste des N éléments ;
'4. Sélectionner A1 et activer la procédure.

'Exemple:
'A1 c
'A2 3
'A3 1
'A4 2
'A5 Excel
'A6 4
'A7 *
'A8 6
'
'La procédure donne alors la liste de toutes les combinaisons
'possibles de 3 éléments choisis parmi 6.


Option Explicit

Dim vAllItems As Variant
Dim Buffer() As String
Dim BufferPtr As Long
Dim Results As Worksheet

Sub ListPermutations()
Dim Rng As Range
Dim PopSize As Integer
Dim SetSize As Integer
Dim Which As String
Dim N As Double
Const BufferSize As Long = 4096

Set Rng = Selection.Columns(1).Cells
If Rng.Cells.Count = 1 Then
Set Rng = Range(Rng, Rng.End(xlDown))
End If

PopSize = Rng.Cells.Count - 2
If PopSize < 2 Then GoTo DataError

SetSize = Rng.Cells(2).Value
If SetSize > PopSize Then GoTo DataError

Which = UCase$(Rng.Cells(1).Value)
Select Case Which
Case "C"
N = Application.WorksheetFunction.Combin(PopSize, SetSize)
Case "P"
N = Application.WorksheetFunction.Permut(PopSize, SetSize)
Case Else
GoTo DataError
End Select
If N > Cells.Count Then GoTo DataError

Application.ScreenUpdating = False

Set Results = Worksheets.Add

vAllItems = Rng.Offset(2, 0).Resize(PopSize).Value
ReDim Buffer(1 To BufferSize) As String
BufferPtr = 0

If Which = "C" Then
AddCombination PopSize, SetSize
Else
AddPermutation PopSize, SetSize
End If
vAllItems = 0

Application.ScreenUpdating = True
Exit Sub

DataError:
If N = 0 Then
Which = "Enter your data in a vertical range of at least 4 cells. " _
& String$(2, 10) _
& "Top cell must contain the letter C or P, 2nd cell is the number" _
& "of items in a subset, the cells below are the values from which" _
& "the subset is to be chosen."
Else
Which = "This requires " & Format$(N, "#,##0") & _
" cells, more than are available on the worksheet!"
End If
MsgBox Which, vbOKOnly, "DATA ERROR"
Exit Sub
End Sub

Private Sub AddPermutation(Optional PopSize As Integer = 0, _
Optional SetSize As Integer = 0, _
Optional NextMember As Integer = 0)

Static iPopSize As Integer
Static iSetSize As Integer
Static SetMembers() As Integer
Static Used() As Integer
Dim i As Integer

If PopSize <> 0 Then
iPopSize = PopSize
iSetSize = SetSize
ReDim SetMembers(1 To iSetSize) As Integer
ReDim Used(1 To iPopSize) As Integer
NextMember = 1
End If

For i = 1 To iPopSize
If Used(i) = 0 Then
SetMembers(NextMember) = i
If NextMember <> iSetSize Then
Used(i) = True
AddPermutation , , NextMember + 1
Used(i) = False
Else
SavePermutation SetMembers()
End If
End If
Next i

If NextMember = 1 Then
SavePermutation SetMembers(), True
Erase SetMembers
Erase Used
End If

End Sub 'AddPermutation

Private Sub AddCombination(Optional PopSize As Integer = 0, _
Optional SetSize As Integer = 0, _
Optional NextMember As Integer = 0, _
Optional NextItem As Integer = 0)

Static iPopSize As Integer
Static iSetSize As Integer
Static SetMembers() As Integer
Dim i As Integer

If PopSize <> 0 Then
iPopSize = PopSize
iSetSize = SetSize
ReDim SetMembers(1 To iSetSize) As Integer
NextMember = 1
NextItem = 1
End If

For i = NextItem To iPopSize
SetMembers(NextMember) = i
If NextMember <> iSetSize Then
AddCombination , , NextMember + 1, i + 1
Else
SavePermutation SetMembers()
End If
Next i

If NextMember = 1 Then
SavePermutation SetMembers(), True
Erase SetMembers
End If

End Sub 'AddCombination

Private Sub SavePermutation(ItemsChosen() As Integer, _
Optional FlushBuffer As Boolean = False)

Dim i As Integer, sValue As String
Static RowNum As Long, ColNum As Long

If RowNum = 0 Then RowNum = 1
If ColNum = 0 Then ColNum = 1

If FlushBuffer = True Or BufferPtr = UBound(Buffer()) Then
If BufferPtr > 0 Then
If (RowNum + BufferPtr - 1) > Rows.Count Then
RowNum = 1
ColNum = ColNum + 1
If ColNum > 256 Then Exit Sub
End If

Results.Cells(RowNum, ColNum).Resize(BufferPtr, 1).Value _
= Application.WorksheetFunction.Transpose(Buffer())
RowNum = RowNum + BufferPtr
End If

BufferPtr = 0
If FlushBuffer = True Then
Erase Buffer
RowNum = 0
ColNum = 0
Exit Sub
Else
ReDim Buffer(1 To UBound(Buffer))
End If

End If

'construct the next set
For i = 1 To UBound(ItemsChosen)
sValue = sValue & ", " & vAllItems(ItemsChosen(i), 1)
Next i

'and save it in the buffer
BufferPtr = BufferPtr + 1
Buffer(BufferPtr) = Mid$(sValue, 3)
End Sub 'SavePermutation
 

Dormeur74

XLDnaute Occasionnel
Re : générer combinaisons sans répétition et sans doublons pour tournois sportifs

Après réflexion, j'ai l'impression de n'avoir pas tout compris.
Un truc m'échappe : tu dis que tu y arrives à la main. Pourrais-tu nous donner un exemple simple sur 3 jours sans répétition ?
 

leonfort2

XLDnaute Nouveau
Re : générer combinaisons sans répétition et sans doublons pour tournois sportifs

Après réflexion, j'ai l'impression de n'avoir pas tout compris.
Un truc m'échappe : tu dis que tu y arrives à la main. Pourrais-tu nous donner un exemple simple sur 3 jours sans répétition ?

Bonjour Dormeur74

voici sur 3 jours
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
17 18 19 20

1 5 20 13
6 10 14 18
7 11 15 3
4 8 12 19
17 2 16 9

1 6 9 19
3 12 14 17
2 5 10 15
4 7 13 18
8 11 16 20

L'objectif du tournoi est de permettre de se rencontrer tous mais jamais 2 fois le même joueur.

Les points sont attribués vis à vis de l'adversaire.
En fait, pour faire court
Dans une partie à 4 : le comptage des points se fait ainsi :
Joueur A contre B, C et D
Joueur B contre C, A et D
Joueur C contre A, B et D
Joueur D contre A, B et C
etc

Ainsi pour 20 participants on gère, par journée, 5 rencontres de 4 joueurs
Et au bout de 5 journées presque tous se sont rencontrés.
Ceux qui ne l'ont pas fait on organise une rencontre complémentaire.
Mais bon on voudrait automatiser tout ça.
Le hic est que en combinatoire j'ai l'impression que toutes les réponses sont là.

Peut-être un algorithme de listage de tirage de loto pourrait convenir.
Au fond, on a 20 boules et 4 numéros gagnants à ceci près qu'il faudrait regrouper les tirages de manière à avoir la complétude des 20 numéros en 5 tranches de 4.
J'espère que cela apporte plus de lumière.

Merci pour m'avoir lu et de vos suggestions
Leonfort2
 

Dormeur74

XLDnaute Occasionnel
Re : générer combinaisons sans répétition et sans doublons pour tournois sportifs

Bon j'ai trouvé un système simple qui permet d'automatiser la génération de tournois sur 5 jours, mais pas sur 6 jours.
Sur 5 jours, c'est assez facile à traiter. A la fin du 5e jour, chaque joueur aura rencontré 15 joueurs différents et n'aura jamais rencontré 2 fois le même joueur.

Maintenant, si tu as une solution à proposer sur 6 jours, alors ton problème est des plus simples.
 

leonfort2

XLDnaute Nouveau
Re : générer combinaisons sans répétition et sans doublons pour tournois sportifs

Bon j'ai trouvé un système simple qui permet d'automatiser la génération de tournois sur 5 jours, mais pas sur 6 jours.
Sur 5 jours, c'est assez facile à traiter. A la fin du 5e jour, chaque joueur aura rencontré 15 joueurs différents et n'aura jamais rencontré 2 fois le même joueur.

Maintenant, si tu as une solution à proposer sur 6 jours, alors ton problème est des plus simples.

Super !
Non pour 6 jours, je ne sais pas faire. Donc on limite les tournois en ce moment à 5 jours et à 20 joueurs.
Peut-être qu'il faudrait passer à 24 joueurs ?
Quelle est ta solution sur 5 jours ? est-ce une macro VB ?
Merci encore
Leo
 

Dormeur74

XLDnaute Occasionnel
Re : générer combinaisons sans répétition et sans doublons pour tournois sportifs

C'est une macro VBA très simple.
grille.jpg
La matrice n° 2 se calcule à partir de celle de gauche (n° 1).
Dans la matrice n° 2, on fait monter la 2e colonne d'une ligne, la 3e colonne de 2 lignes et la 3e colonne de 3 lignes, la 1ère restant fixe.
Les matrices 3,4 et 5 se calculent à partir des matrices 2,3 et 4.

On a une 1ère solution. Maintenant, si on fait par tirage au sort un tableau de conversion du type :
1=4
2=15
3=19
4=16
5=5
6=3
7=11
8=12
9=17
10=1
11=8
12=20
13=2
14=6
15=18
16=7
17=10
18=13
19=14
20=9
En remplaçant les valeurs de la solution du haut par celles du tirage au sort on obtient une 2e solution.
Et on a 20! solutions (des milliards de milliards).
Très facile à mettre en musique sous VBA. Je te mettrai ça en musique demain matin si ça t'intéresse.
 

Dormeur74

XLDnaute Occasionnel
Re : générer combinaisons sans répétition et sans doublons pour tournois sportifs

C'est une macro VBA très simple.

La matrice n° 2 se calcule à partir de celle de gauche (n° 1).
Dans la matrice n° 2, on fait monter la 2e colonne d'une ligne, la 3e colonne de 2 lignes et la 3e colonne de 3 lignes, la 1ère restant fixe.
Les matrices 3,4 et 5 se calculent à partir des matrices 2,3 et 4.

On a une 1ère solution. Maintenant, si on fait par tirage au sort un tableau de conversion du type :
1=4
2=15
3=19
4=16
5=5
6=3
7=11
8=12
9=17
10=1
11=8
12=20
13=2
14=6
15=18
16=7
17=10
18=13
19=14
20=9
En remplaçant les valeurs de la solution du haut par celles du tirage au sort on obtient une 2e solution.
Et on a 20! solutions (des milliards de milliards).
Très facile à mettre en musique sous VBA. Je te mettrai ça en musique demain matin si ça t'intéresse.
 

leonfort2

XLDnaute Nouveau
Re : générer combinaisons sans répétition et sans doublons pour tournois sportifs

C'est une macro VBA très simple.
Regarde la pièce jointe 272301
La matrice n° 2 se calcule à partir de celle de gauche (n° 1).
Dans la matrice n° 2, on fait monter la 2e colonne d'une ligne, la 3e colonne de 2 lignes et la 3e colonne de 3 lignes, la 1ère restant fixe.
Les matrices 3,4 et 5 se calculent à partir des matrices 2,3 et 4.

On a une 1ère solution. Maintenant, si on fait par tirage au sort un tableau de conversion du type :
1=4
2=15
3=19
4=16
5=5
6=3
7=11
8=12
9=17
10=1
11=8
12=20
13=2
14=6
15=18
16=7
17=10
18=13
19=14
20=9
En remplaçant les valeurs de la solution du haut par celles du tirage au sort on obtient une 2e solution.
Et on a 20! solutions (des milliards de milliards).
Très facile à mettre en musique sous VBA. Je te mettrai ça en musique demain matin si ça t'intéresse.

Meri Dormeur74
la solution avec matrice et décalage c'est à peu la méthode que j'utilise.
Mais l'ennui c'est que je dois vérifier si pas de doublons, or avec le nombre de participants cela commence à se mélanger dans ma tête.
Je suis preneur pour une méthode automatisée, qui m'assure qu'il n'y a pas de doublons
Je ne comprend pas bien la méthode des tirage au sort, mais si tu penses que ça marche. Pourquoi pas.
En tant que combinatoire je pense q'il y a un peu moins de 20! réponses possibles.
Donc je suis preneur d'une macro VB
Bon dimanche
Leo
 

CBernardT

XLDnaute Barbatruc
Re : générer combinaisons sans répétition et sans doublons pour tournois sportifs

Bonjour,

Planning de tournoi effectué par tirage aléatoire. Cinq rencontres entre 20 participants sans doublon.
Chaque tirage est différent.
La feuille des rencontres est protégé. PWD : *** (Trois étoiles).
La plage des inscriptions est non protégée, normal Lol.
Le report des résultats dans la feuille "TOURNOI" s'effectue par simple formule (=A1) depuis le tableau de calcul situé dans la feuille "TIRAGE", masquée.

La fermeture par les croix enregistre automatiquement le classeur.
 

Pièces jointes

  • Rencontres-V1.xlsm
    36.4 KB · Affichages: 386

leonfort2

XLDnaute Nouveau
Re : générer combinaisons sans répétition et sans doublons pour tournois sportifs

Bonjour,

Planning de tournoi effectué par tirage aléatoire. Cinq rencontres entre 20 participants sans doublon.
Chaque tirage est différent.
La feuille des rencontres est protégé. PWD : *** (Trois étoiles).
La plage des inscriptions est non protégée, normal Lol.
Le report des résultats dans la feuille "TOURNOI" s'effectue par simple formule (=A1) depuis le tableau de calcul situé dans la feuille "TIRAGE", masquée.

La fermeture par les croix enregistre automatiquement le classeur.

Bonsoir Bernard,
Génial,
c'est simplement ce qu'il me faut.
Je vais pouvoir le tester cette semaine. On a justement 5 journées de mardi à dimanche.
Est ce que tous les joueurs se rencontrent ?
Quand je fais ça "à la main" il me reste toujours des couples qui ne se sont pas rencontrées.

D'où ma question, subsidiaire, (mais ça dépasse mes compétences, y aurait-il un nombre optimale de rencontres à programmer pour que 20 joueurs puissent se rencontrer tous une fois et une seule ?
Ou reformulée autrement en sachant qu'il y aurait toujours 5 jours de compétitions et des équipes de 4 joueurs.
Peut-être faudrait-il 3 joueurs ?

Encore merci
Leonfort
 

Dormeur74

XLDnaute Occasionnel
Re : générer combinaisons sans répétition et sans doublons pour tournois sportifs

Bonjour tout le monde
La proposition promise.
On a 20!/4! solutions différentes, ce qui te laisse la possibilité de jouer pendant 115720224894 siècles à raison d'une heure par match.
Pour 24 joueurs ? Je ne sais pas faire.
 

Pièces jointes

  • tirage.xls
    31 KB · Affichages: 298
  • tirage.xls
    31 KB · Affichages: 306
  • tirage.xls
    31 KB · Affichages: 326

leonfort2

XLDnaute Nouveau
Re : générer combinaisons sans répétition et sans doublons pour tournois sportifs

Bonjour tout le monde
La proposition promise.
On a 20!/4! solutions différentes, ce qui te laisse la possibilité de jouer pendant 115720224894 siècles à raison d'une heure par match.
Pour 24 joueurs ? Je ne sais pas faire.

Encore Merci Dormeur74

je suis vraiment comblé. C'est très efficace.

Leonfort2
 

chokri.trimech

XLDnaute Nouveau
Exercice à résoudre:
1. une macro ou autre application pour toutes les combinaisons possibles
2. la combinaison la moins disante sachant qu'une entreprise ne peut participer à 2 lots. Merci
Lot 1Lot 2Lot 3Lot 4
Entreprise 110000500200
Entreprise 210010501201
Entreprise 3005020
Entreprise 400503202
Entreprise 510020504189
 

Discussions similaires

Réponses
19
Affichages
2 K

Statistiques des forums

Discussions
311 723
Messages
2 081 932
Membres
101 844
dernier inscrit
pktla