cs_HiKwesT
Messages postés17Date d'inscriptionmardi 15 mars 2005StatutMembreDernière intervention 8 janvier 2008
-
15 avril 2007 à 16:56
cs_HiKwesT
Messages postés17Date d'inscriptionmardi 15 mars 2005StatutMembreDerniè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...
cs_MPi
Messages postés3877Date d'inscriptionmardi 19 mars 2002StatutMembreDernière intervention17 août 201823 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.
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.
jmfmarques
Messages postés7666Date d'inscriptionsamedi 5 novembre 2005StatutMembreDernière intervention22 août 201427 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...)
cs_MPi
Messages postés3877Date d'inscriptionmardi 19 mars 2002StatutMembreDernière intervention17 août 201823 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...)
jmfmarques
Messages postés7666Date d'inscriptionsamedi 5 novembre 2005StatutMembreDernière intervention22 août 201427 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é)
Vous n’avez pas trouvé la réponse que vous recherchez ?
cs_lermite222
Messages postés492Date d'inscriptionjeudi 5 avril 2007StatutMembreDernière intervention 2 juillet 20124 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
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
cs_lermite222
Messages postés492Date d'inscriptionjeudi 5 avril 2007StatutMembreDernière intervention 2 juillet 20124 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
jmfmarques
Messages postés7666Date d'inscriptionsamedi 5 novembre 2005StatutMembreDernière intervention22 août 201427 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.
cs_MPi
Messages postés3877Date d'inscriptionmardi 19 mars 2002StatutMembreDernière intervention17 août 201823 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
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)...
cs_MPi
Messages postés3877Date d'inscriptionmardi 19 mars 2002StatutMembreDernière intervention17 août 201823 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)
chaibat05
Messages postés1883Date d'inscriptionsamedi 1 avril 2006StatutMembreDernière intervention20 novembre 20072 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...
cs_HiKwesT
Messages postés17Date d'inscriptionmardi 15 mars 2005StatutMembreDerniè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...