Tirage au sort

2e8b92

XLDnaute Nouveau
Bonsoir tout le monde,

sachant que j´ai, au moins, 8 joueuses et 8 joueurs de Tennis, comment faire pour former des double-mixtes avec les règles suivantes?

M1 à M(n) et F1 à F(n)

- chaque joueur ne peut jouer qu´une seule fois avec le même partenaire
- chaque joueur ne peut jouer qu´une seule fois contre le même adversaire

comment modéliser cela en VBA?

Cordialement,
Stéphane
 

Dranreb

XLDnaute Barbatruc
Bonsoir.
Voyez si vous pouvez vous inspirer de cette programmation.

Il y a aussi d'autres tirages qui marche sur le même principe et peut être plus adaptés (doublettes pour la pétanque notamment) dans ce second fichier.

Il y a aussi cette fourniture

Tous ces algorithmes marchent sur le même principe: Une procédure récursive qui choisit dans une liste aléatoire fixée par un objet ListeAléat un joueur à ranger (ou une paire si toutes les rencontres possibles doivent avoir lieu), vérifie s'il convient de son point de vue, et si oui s'appelle récursivement pour vérifier que cela permet de faire le reste.
 

Pièces jointes

  • ListeAléatSnoopy07.xlsm
    53.7 KB · Affichages: 87
  • ListeAléat.xlsm
    130 KB · Affichages: 92
Dernière édition:

2e8b92

XLDnaute Nouveau
Bonjour,

merci pour votre aide, cependant l´utilisation de l´onglet "2 contre 2" (16 joueurs, 5 manches), génère un tirage au sort sans tenir compte du sexe des joueurs, de plus est-ce normal de ne pas avoir accès au code?

merci par avance
Stéphane
 

2e8b92

XLDnaute Nouveau
en ouvrant le fichier "ListeAléat", je n´ai pas accès directement aux macros, que ce soit dans le menu "Macros / View macros" ou en faisant cliquant droit sur le bouton "tirage", alors que la feuille n´est même pas protégée par un mot de passe.
quoiqu´il en soit, j´ai réussi à trouver la fonction Tirage22OK et je dois avouer que je n´y comprend pas grand-chose.
Auriez-vous du temps afin de me l´expliquer? Merci par avance

Function Tirage22OK(ByVal JMax As Long, ByVal Tours As Long, TClub(), TMarg()) As Boolean
Dim X As Long, J As Long, A As Long, M As Long
UFmVisu.DescConfig JMax & " joueurs " & Tours & " tours."
MMax = Tours: LMax = (JMax - 2) \ 4 + 1: NivMax = MMax * LMax - 1
X = XTria(JMax, JMax - 1)
ReDim Tirage(1 To MMax, 1 To LMax, 1 To 4), JoueursManche(1 To MMax), _
DéjàRenc(0 To X), DéjàPart(0 To X), DéjàTêteÀTête(1 To JMax)
If UBound(TClub, 1) >= JMax Then
For J = 2 To JMax: For A = 1 To J - 1
X = XTria(J, A)
If Not IsEmpty(TClub(J, 1)) And Not IsEmpty(TClub(A, 1)) Then
DéjàRenc(X) = TClub(J, 1) = TClub(A, 1): End If
Next A, J: End If
If UBound(TMarg, 1) >= JMax Then
For J = 2 To JMax: For A = 1 To J - 1
X = XTria(J, A)
If Not IsEmpty(TMarg(J, 1)) And Not IsEmpty(TMarg(A, 1)) Then
DéjàPart(X) = TMarg(J, 1) = TMarg(A, 1): End If
Next A, J
For J = 1 To JMax: DéjàTêteÀTête(J) = Not IsEmpty(TMarg(J)): Next J: End If
Randomize
For M = 1 To MMax: Set JoueursManche(M) = New ListeAléat
JoueursManche(M).Init JMax: Next M
If RencTrouvée(0) Then Tirage22OK = True: UFmVisu.Conclure Else UFmVisu.Echec
End Function
 

2e8b92

XLDnaute Nouveau
Bonsoir,

j´ai résolu mon problème en trouvant une solution pour respecter toutes les règles énoncées dans mon 1er message ci-dessus.
Maintenant, j´ai un souci de performance parfoi même mon programme se bloque.
Pourriez-vous m´indiquer ce qui peut être optimisé?

Merci par avance,
Stéphane
 

Pièces jointes

  • Tennis Double Mixte22.xls
    143.5 KB · Affichages: 46

Dranreb

XLDnaute Barbatruc
Pour pouvoir vous écrire votre propre procédure de tirage il y a 3 choses à comprendre.
1) — Comment s'utilise un objet ListeAléat. Voir le module de classe de même nom, il est bien documenté.
2) — La pièce centrale est une procédure récursive. Elle s'appelle elle même, entrainant la réservation d'un nouveau jeu de paramètres et de variables locales.
3) — Elle utilise une fonction XTria qui permet de considérer un tableau à une seule dimension comme un tableau triangulaire. Elle calcule son indice réel dans la dimension unique selon deux numéros de joueurs différents spécifiés en ordre quelconque. Sont utilisés de cette façon deux tableaux de Boolean: les paires de joueurs ayant des déjà été partenaires et adversaires.
Pour que les filles et les garçons ne puissent jamais être partenaires entre eux il suffit de dire dans la table triangulaire correspondante qu'il l'ont déjà été avant de commencer le tirage.

Ces techniques participent à obtenir de bonnes performances. On n'utilise que des tableaux VBA, jamais de cellules, sauf au début pour prendre les données (les noms essentiellement) et à la fin pour y stocker les résultats.
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Bonjour.
J'en suis là. Ça ne marche qu'une fois sur 10 avec ces contraintes.
Préfèreriez vous que j'y remette en service l'UFmVisu pour estimer visuellement s'il peut souvent aller presque jusqu'à la fin et pouvoir l'arrêter quand on veut ?
 

Pièces jointes

  • Tirage22TerLim2e8b92.xlsm
    39.1 KB · Affichages: 44

Dranreb

XLDnaute Barbatruc
Oh, non. C'est à supprimer entièrement.
Regardez la procédure TestTirage. Elle n'est pas très compliquée.
La Function Tirage22OK ne fournit que des numéros dans un tableau Public nommé Tirage.
Après on en fait facilement ce qu'on veut.

La version avec UFmVisu.

(Pièce jointe supprimée: classeur complété, message suivant)
 
Dernière édition:

2e8b92

XLDnaute Nouveau
tout d´abord merci beaucoup pour votre aide
ensuite, je dois avouer que le code ne fonctionne qu´avec un nombre pair de joueurs. Dans mon cas, je ne connaitrais le nombre de participants que le jour du tournoi (et ajouter une personne fictive ou empêcher quelqu´un de jouer n´est pas mon objectif).
enfin, que ce soit avec mon script ou le votre, il semble clair que 8 femmes et 8 hommes, 5 parties sur 4 terrains, cela n´est mathématiquement pas faisable (j´aimerais bien trouver la formule pour en avoir la certitude).
Donc il me reste la possibilitée de remplacer les arrays par les collections ou les dictionnaires ou bien d´autoriser une personne à jouer plus d´une fois contre le même adversaire.
 

Dranreb

XLDnaute Barbatruc
Bonsoir.
Dans le dernier classeur il y avait 11 hommes et 10 femme soit 21 joueurs en tout, donc impaire, et je suis parvenu à les faire se rencontrer en jusqu'à 7 rondes. Mais ça échoue souvent.
8 femmes et 8 hommes en 5 parties sur 4 terrain, si, ça passe ! C'est la configuration que j'avais laissée dans la Feuil1 de test (les numéros allant jusqu'au nombre d'hommes y sont censés les être, les suivants les femmes). Mais ça se présente souvent assez mal pour qu'il faille essayer plusieurs fois.
 

Discussions similaires

Réponses
6
Affichages
621
Réponses
30
Affichages
2 K