Genrerer un calendrier sportif aléatoirement

cs_HiKwesT Messages postés 17 Date d'inscription mardi 15 mars 2005 Statut Membre Dernière intervention 8 janvier 2008 - 15 avril 2007 à 16:56
cs_HiKwesT Messages postés 17 Date d'inscription mardi 15 mars 2005 Statut Membre Dernière intervention 8 janvier 2008 - 18 avril 2007 à 04:44
Bonjour,

Aprés 3 journées a retourner le probleme dans tout les sens, je m'en remet a vous "VBFrançiens" et a votre logique

Je souhaite pour ma PTI de fin d'année gerer un competition de football sous VB 6 et access, et je souhaiterait pour cet competion generer aléatoirement le calendrier des rencontres

Mon calendrier comporte 14 journées, chaque journé comporte en tout 4 match (8 équipes).

J'arrive a generer aléatoirement les numéros d'equipe pour chaque journée, et verifie que ce numero n'existe pas dans la meme journé (afin d'eviter les cas improbable qu'une equipe ne joue 2 fois ou se rencontre elle meme), mais je cale a niveau de la verification dans le championnat tout entier :
En effet, je dois verifier que la combinaison d'un match n'existe pas deux fois (ex 2 ne peut pas rencontrer 8 deux fois).

Mon algo est avancer jusque la detection de cet existence, ou non, mais lorsque celle ci existe, je n'arrive pas a la modifier : 
      Different cas se presente : lorsque c'est le dernier numero possible, devoir reinitialiser toute la journée et ceux jusqu'a ce que la combinaison fonctionne?
                                              lorsque les 2,3, 4 ou plus derniers numero sont utilise?

voici la partie de code que j'ai deja potasser, mes essais s'effctuant sur la partie avec les "???" mais chacun ayant boucler a l'infini...

For i = 1 To 14 'pour chaque journée de championnat
    For j = 1 To 4 'pour chaque match dans la journé
        For k = 1 To 2 'pour chaque equipe du match
            Do
                Valide = True
                Equipe = Int(Rnd * (8) + 1)
               
                'verification de l'existence dans la même journée
                    For l = 1 To j
                        For m = 1 To 2
                            If T_Team(i, l, m) = Equipe Then                                Valide False 'si l'equipe joue deja dans cet journé alors faux
                            End If
                        Next
                    Next
               
                'verification de l'existence de la combinaison dans le championnat                If k 2 And Valide True And i > 1 Then
                    For l = 1 To i - 1
                        For m = 1 To 4
                            If T_Team(l, m, 1) & T_Team(l, m, 2) = T_Team(i, j, 1) & Equipe Then
                                Valide = False 'verifie si cet combinaison existe dans le championnat et auquelle cas la refuse
                            End If
                        Next
                    Next



                    If Valide = False Then 'si la combinaison existe alors
                   
                    '####????????????????#####
   
                    End If



                End If



            Loop Until Valide = True
           
            T_Team(i, j, k) = Equipe
           
        Next
    Next
Next


Merci a tous ceux qui voudron m'aider... je desespere de ne pas trouve...

16 réponses

cs_MPi Messages postés 3877 Date d'inscription mardi 19 mars 2002 Statut Membre Dernière intervention 17 août 2018 23
15 avril 2007 à 18:43
Tu dis qu'une équipe ne peut jouer 2 fois avec la même.
Es-tu certain ?

4 matches sur 14 journées = 56 matches en principe.
Mais comme un match (équipe1 vs équipe2) = (équipe2 vs équipe1), ça ne t'en donne que 28 possibles, si je ne me trompe.

<col style=\"width: 34pt;\" span=\"7\" width=\"45\" />----
1_2, 2_3, 3_4, 4_5, 5_6, 6_7, 7_8, ----
1_3, 2_4, 3_5, 4_6, 5_7, 6_8, , ----
1_4, 2_5, 3_6, 4_7, 5_8, , , ----
1_5, 2_6, 3_7, 4_8, , , , ----
1_6, 2_7, 3_8, , , , , ----
1_7, 2_8, , , , , , ----
1_8

Cette liste montre chaque possibilités que je peux voir. Chaque équipe aura joué contre 7 équipes différentes.

Quoiqu'il en soit, je pense que tu devrais établir toutes les possibilités, un peu comme ce tableau, et tirer au sort quelle équipe portera le numéro 1, le 2 et les autres. Comme ça, à chaque fois que tu démarres le tirage au sort il y aura mélange d'équipes.
 Et ces 28 matches peuvent aussi être mélangés.

MPi
0
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
15 avril 2007 à 19:01
Bonjour,

Je n'ai pas l'intention de te faire ton code, mais de t'ouvrir la pensée sur un mécanisme simple :

Je vais raisonner volontairement à haute voix !

14 journées
4 matches par journée
 j'ai donc au total 56 matches
8 équipes
j'ai donc au total 56 matches à partager entre 8 équipes
il me faut donc rechercher les cominaisons possibles de deux éléments pris 2 à 2 parmi 8 éléments
une fois cette liste dressée, il me suffit alors de répartir aléatoirement sur mes jours, à raison
de 4 matches par jour
 Comment ?
Mécanisme ma foi assez simple, toutes mes combinaisons de groupes de 2 alimentent une listbox
je tire aléatoirement un indice de cette liste et me contentente de vérifier qu'aucune des 2 équipes
correspoindant à cet indice n'a déjà été choisie pour jouer ce jour-là
si oui, je tire à nouveau aléatoirement jusqu'à ce que non
si non : je mets cette combinaison de 2 dans un match, en suivant l'ordre chronologique des matches
et supprime l'indice correspondant de ma listbox (donc cette comninaison ne pourra plus être tirée).
chaque tirage est celui d'un indice aléatoire entre 0 et le liscount-1

A toi de jouer, maintenant...
Un conseil pour t'y retrouver mieux : nomme chaque équipe en lui attribuant une lettre (A,B,C,D, etc...)
0
cs_MPi Messages postés 3877 Date d'inscription mardi 19 mars 2002 Statut Membre Dernière intervention 17 août 2018 23
15 avril 2007 à 19:16
Voici une liste de 28 matches selon les critères que tu proposes, c'est-à-dire 4 matches par jour et aucune équipe ne se répète à chaque jour. (Bien pratique cet Excel...)

<col style=\"width: 42pt;\" width=\"56\" /><col style=\"width: 34pt;\" span=\"4\" width=\"45\" />----
Matches, 1, 2, 3, 4, ----
, , , , , ----
Jour1, 1_2, 3_4, 5_6, 7_8, ----
Jour2, 1_3, 2_4, 5_7, 6_8, ----
Jour3, 1_4, 2_7, 3_6, 5_8, ----
Jour4, 1_5, 2_6, 3_7, 4_8, ----
Jour5, 1_6, 2_8, 3_5, 4_7, ----
Jour6, 1_7, 2_5, 3_8, 4_6, ----
Jour7, 1_8, 2_3, 4_5, 6_7

MPi
0
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
15 avril 2007 à 19:23
Bon... Nous sommes dimanche (jour de gentillesse) et nous n'avons pas Excel, dont nous allons donc nous passer ...

La voilà, ta liste de combinaisons 2 à 2 parmi 8 équipes :

Private Sub Command1_Click()
  toto = "ABCDEFGH"
  List1.Clear
  While Len(toto) > 0
   choix = Left(toto, 1)
   For i = 2 To Len(toto)
     List1.AddItem choix & Mid(toto, i, 1)
   Next
   toto = Mid(toto, 2)
  Wend
End Sub

Le reste es simple, maintenant (relis ce que je t'ai exposé)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_lermite222 Messages postés 492 Date d'inscription jeudi 5 avril 2007 Statut Membre Dernière intervention 2 juillet 2012 4
15 avril 2007 à 19:26
Salut
J'ai fait une petite approche de ton problème
essaye ce ptit bout de code

Dim Championnat1() As Integer
Dim Championnat2() As Integer
Dim journée As Integer
Dim NbEquipe As Integer
Dim A() As Integer




Private Sub Form_Load()
journée = 12 '12 journée de championnat
NbEquipe = 8 'nombre d'équipe dans le championnat
ReDim Championnat1(journée, NbEquipe / 2)
ReDim Championnat2(journée, NbEquipe / 2)
    Planing
End Sub
Function Planing()
Dim i As Integer
Dim b As Integer, c As Integer, e As Integer
   
    'le nombre de journée
    For i = 1 To journée
        Grid1.Col = i
        initialiseEquipe
        For e = 1 To (NbEquipe / 2) - 1
            'sélectionne l'équipe1
            b = Int(Rnd * (UBound(A)) + 1)
            Championnat1(i, e) = A(b)
            enlève b
            'sélectionne l'équipe2
            c = Int(Rnd * (UBound(A)) + 1)
            Championnat2(i, e) = A(c)
            enlève c
            Grid1.Row = e
            Grid1.Text = Championnat1(i, e) & " : " & Championnat2(i, e)
        Next e
        'il reste 2 équipe
        Championnat1(i, e) = A(1)
        Championnat2(i, e) = A(2)
        Grid1.Row = e
        Grid1.Text = A(1) & " : " & A(2)
    Next i


End Function
Sub initialiseEquipe()
ReDim A(NbEquipe)
Dim i As Integer    For i 1 To NbEquipe: A(i) i: Next i
End Sub
Sub enlève(n As Integer)
    A(n) = A(UBound(A))
    ReDim Preserve A(UBound(A) - 1)
End Sub

Coler le code dans une feuille et un flexgrid nommer Grid1 sur la feuille
Bon amusement
louis
0
cs_HiKwesT Messages postés 17 Date d'inscription mardi 15 mars 2005 Statut Membre Dernière intervention 8 janvier 2008
15 avril 2007 à 19:28
Tout d'abord un grand merci a tous pour vos reponse

vos solutions sont bonne, et j'y integre les matchs retour, soit :

1_2   2_1   3_1   4_1   5_1   6_1   7_1   8_1
1_3   2_3   3_2   4_2   5_2   6_2   7_2   8_2
1_4   2_4   3_4   4_3   5_3   6_3   7_3   8_3
1_5   2_5   3_5   4_5   5_4   6_4   7_4   8_4
1_6   2_6   3_6   4_6   5_6   6_5   7_5   8_5
1_7   2_7   3_7   4_7   5_7   6_7   7_6   8_6
1_8   2_8   3_8   4_8   5_8   6_8   7_8   8_7

vos solutions m'aiguille sur le fait que je ne vais pas dans le bon sens en voulant chercher des nombres aleatoirement jusqu'il me toruve la bonne combinaison? je vais donc dans un tableau, integrer chauqe possiblite et ainsi aller les chercher par l'intermediaire de l'index et les mettre aleatoirement

J'avance... grace a vous, merci
0
cs_lermite222 Messages postés 492 Date d'inscription jeudi 5 avril 2007 Statut Membre Dernière intervention 2 juillet 2012 4
15 avril 2007 à 19:29
bonjour jfmarque,
je ne crois pas qu'il ai VBA ,dans le titre il y a VB6
mais si c'est le cas, il n'a que de modifié pour mettre dans une feuille
A+
louis
0
cs_lermite222 Messages postés 492 Date d'inscription jeudi 5 avril 2007 Statut Membre Dernière intervention 2 juillet 2012 4
15 avril 2007 à 19:32
salut mpi
apparement tu n'est pas fou de foot, car tu devrais savoir que toute les équipes joues chaque journées .
A+
louis
0
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
15 avril 2007 à 19:33
Bonjour Lermite222,

Je sais bien qu'il est sous VB6 !
Je ne parlais de VBA que parce que MPI louait les mérites de VBA .... dont je ne me sers pas .... et pour montrer qu'on peut faire aussi bien sans VBA, justement.
0
cs_MPi Messages postés 3877 Date d'inscription mardi 19 mars 2002 Statut Membre Dernière intervention 17 août 2018 23
16 avril 2007 à 23:39
Salut lermite,
effectivement, je ne connais à peu près rien au foot ( au vôtre autant qu'au nôtre...)
Ici, c'est plutôt le hockey... ¦¬)

Mais je me fiais aux chiffres donnés plus qu'au fait qu'un équipe qui joue 14 matches en 14 jours doit avoir les jambes molles à la fin... Au hockey, c'est 4 matches semaine max

MPi
0
cs_HiKwesT Messages postés 17 Date d'inscription mardi 15 mars 2005 Statut Membre Dernière intervention 8 janvier 2008
17 avril 2007 à 13:15
Alors voila l'avancement, qui me fait calé une fois de plus :

Pour plus de simplicité, j'ai decider de repartir en 56 matchs ( de 1 a 56) et non pas en 14 journée de 4 matchs

J'ai, a l'interieur d'un tableau integrer toutes mes possibilités de matchs aller/retour

Verif() = Array(12, 13, 14, 15, 16, 17, 18, 21, 23, 24, 25, 26, 27, 28, 31, 32, 34, 35, 36, 37, 38, 41, 42, 43, 45, 46, 47, 48, 51, 52, 53, 54, 56, 57, 58, 61, 62, 63, 64, 65, 67, 68, 71, 72, 73, 74, 75, 76, 78, 81, 82, 83, 84, 85, 86, 87)

ainsi qu'un tableau qui contient la liste des equipes (pour verifier que non pas encore jouer dans la même journé)

Equipe() = Array(1, 2, 3, 4, 5, 6, 7, 8)

je vais ensuite derouler mon algo, en gros je tire un numero au hasard pour choisir la combinaison d'equipe a affecter au match n°1 jusque 56, en prenant soin de verifier que l'un des deux equipe d'un match n'a pas deja jouer dans un lot de 4 match par l'intermediaire d'un effacement dans un tableau!
Mais ca cal, car par exemple, pour le match 7 je tire la combinaison 18 (1 contre 8), au match 16 je tire la combinaison 81(1 contre 8) mais pour le match 30 il ne reste que la possibilite de tirée une combinaison qui contient un 1 et un 8, ce qui fait boucler indefeniment car ces possibilite n'existe plus (mais le fait des 3 precedent tirage, il ne me reste plus que cet possibilite):

Je ne voit pas comment contrecarer ce mecanisme :'(

For i = 1 To 56



Do
Valide1 = False
Valide2 = False
    Do
        hasard = Int(Rnd * (56) + 1)
   
    Loop Until Verif(hasard - 1) <> ""



        Equipe1 = Mid(Verif(hasard - 1), 1, 1)
       
        Equipe2 = Mid(Verif(hasard - 1), 2, 1)
       
        For j = 1 To 8
            If Equipe(j - 1) = Equipe1 Then
                Valide1 = True
            Else
                If Equipe(j - 1) = Equipe2 Then
                    Valide2 = True
                End If
            End If
        Next
    Loop Until Valide1 True And Valide2 True
    Verif(hasard - 1) = ""
    Indice = Indice + 1
    Equipe(Equipe1 - 1) = 0
    Equipe(Equipe2 - 1) = 0
    If Indice = 4 Then
        Equipe() = Array(1, 2, 3, 4, 5, 6, 7, 8)
        Indice = 0
    End If
    MsgBox ("i=" & i & " - match: " & Equipe1 & Equipe2)
Next




Merci a tous pour l'aide que vous m'avez apporter, j'ai aussi essayer le code qui s'aide d'un flexgrid mais je rencontre un probleme de match existant 2 fois...

Si vous avez des iddées, parce que moi je seche (je ne demande pas le code tout fait, mais la logique a developper pour arriver a mes fins et comprendre)...
   
0
cs_MPi Messages postés 3877 Date d'inscription mardi 19 mars 2002 Statut Membre Dernière intervention 17 août 2018 23
18 avril 2007 à 00:36
Si tu te fies au tableau de 4 x 7 que j'ai mis, chaque journée comprend
4 matches dont les équipes ne se répètent pas, donc un maximum de 4
matches par jour si tu ne veux pas qu'une équipe joue 2 fois dans une
même journée.

Un tableau à 2 dimensions, suivant l'ordre donné, devrait te permettre de définir des matches sans problèmes, en autant que tu t'en tiennes à chaque ligne de ce tableau. Tu pourrais aussi y arriver avec un tableau à une seule dimension (que je préfère... mais ça c'est moi...)

For i = 0 to UBound(Tablo) step 4  ' 4 matches possibles par jour
'tablo comprend les données du tableau 4x7 de gauche à droite et en descendant
'premier match = left(tablo(I), 1) contre Right(tablo(I), 1)
'deuxième match = left(tablo(I+1), 1) contre Right(tablo(I+1), 1)

...

reste à voir si ma logique est bonne...

MPi
0
chaibat05 Messages postés 1883 Date d'inscription samedi 1 avril 2006 Statut Membre Dernière intervention 20 novembre 2007 2
18 avril 2007 à 01:06
Bonsoir MPi,
si tu pouvais redéfinir ton tableau à trois dimensions,
tu pourras y integrer le N° de la journée:


Rencontre(Jour,Equipe1,Equipe2)


Ainsi tu pourras savoir quels matchs se jouent  telle journée
0
cs_MPi Messages postés 3877 Date d'inscription mardi 19 mars 2002 Statut Membre Dernière intervention 17 août 2018 23
18 avril 2007 à 02:43
Peut-être Chaibat, mais mon cerveau n'est pas fait pour ce genre de dimensions... ¦¬)

Mais je sais qu'un tableau à une dimension se travaille plus rapidement qu'à plusieurs...

MPi
0
chaibat05 Messages postés 1883 Date d'inscription samedi 1 avril 2006 Statut Membre Dernière intervention 20 novembre 2007 2
18 avril 2007 à 03:58
   MPi  ,


J' ai pas pu résister à réfléchit au problème sans pour autant
aller jusqu' à le coder.4 ans plutôt et j' aurais foncé...:-)
Il faut croire que je commence à ...
Mais bon ..


Voici tout de même un shéma


1° Générer aléatoirement deux groupes de 4
'Pour l' exemple on prend le plus simple


1 2 3 4  /  5 6 7 8  
'çà pourra bien être 1 4 5 7 /  2  3 6 8  comme point de départ


On reste sur 1 2 3 4  /  5 6 7 8  et on aligne les deux groupes
Première journée donc
 1  5
 2  6
 3  7
 4  8


Deuxième journée
On fait décaler les éléments du 2° groupe
1   6
2   7
3   8
4   5


Troixième journée
1  7
2  8
3  5
4  6


Quatième journée
1  8
2  5
3  6
4  7


Reste à faire rencontrer les équipes de chaque groupe
Cinquièème journée 'peut aussi se faire aléatoirement au sein
d' un même groupe
1  2
3  4


5  6
7  8


On fait décaler les éléments des groupes ainsi formés
Sixème journée


1 3
2 4


5 7
6 8


Septième journée
1  4
2  3
5  8
6  7


A partir de là c' est le retour
Il suffit d' inverser les combinaison à partir de la première journée


Bien sûr ce n' est qu' un shema, il va de soit qu' il faut mettre en place
le système.


Pour le suivi, je serai absent pendant 3 ou 4 jours.
(vacances méritées)...
Dans une heure je prend la route...

Salut à tous


A+


 




 
0
cs_HiKwesT Messages postés 17 Date d'inscription mardi 15 mars 2005 Statut Membre Dernière intervention 8 janvier 2008
18 avril 2007 à 04:44
Bonsoir et merci a tous...
Votre raisonnement est bon, et m ouvert l'esprit sur une autre methode a employé! Je m'enteté a voiloir generer un calendrier aleatoirement, en modifiant a chaque tirage les rencontres, alors qu'en procedant de la sorte, c'est a dire en gardant toujours les meme rencontres mais en affectant cet fois ci aleatoirement les equipes au numero (France 1 dans un tirage, mais peut etre5 dans un autres)...

demain je code cet methode, en esperant que cet fois ci c'est la bonne! je ne manquerait pas de vous tenir au courant....

Encore un grand merci a tous de m'ouvrir les iddées...
0
Rejoignez-nous