View Full Version : Algoritmo per calendario tornei!!!
Ragazzi il moi problema è il seguente...devo fare un programma che mi generi un calendario per un torneo. :)
Esempio:
Giocatori: A, B, C, D
Calendario:
1° Turno: A - B ed C - D
2° Turno: A - C ed B - D
3° Turno: A - D ed B - C
Naturalmente non ci possono essere ripetizioni di partite, per cui un eventuale B - A oppure un C - B non sono accettati!!!
Fino a qui tutto semplice...ma se io introduco anche i giocatori E, F, G, H diventa più complesso!!! :(
Io ho fatto un programma solo che superato i 20 giocatori diventa lento e non riesce più a trovare le coppie!! :muro:
Avete qlc idea a proposito...è molto importante!!!
Allego il mio programma cosi potete dare un okkiata, non è fatto troppo funzionale, ma a me serve che mi generi solo il calendario!!! ;)
Ciaoooooooooooooooooooooooooooooo :p
PS: come idea mi è venuto in mente che potrei generare tutte le coppie possibili in un vettore, dopo di che combinarle fra di loro...non so se è un buon metodo, certo però mi sembra migliore di quello utilizzato nel progetto (almeno credo) :rolleyes:
Proprio non avete idee a proposito ??? :(
lombardp
08-05-2003, 16:04
Se ti serve un metodo per generare tutte le possibili coppie tra N giocatori, un metodo è questo (in pseudo-C):
giocatore[] è un array di N stringhe.
for (i=0;i<N-1;i++) {
for (j=i+1;j<N;j++) {
printf("\ncoppia = %s - %s",giocatore[i],giocatore[j])
}
}
Come te la cavi con lo spagnolo? Io avevo trovato giusto un mesetto fa questo per un amico:
http://www.lsi.upc.es/~iea/transpas/3_divide/tsld057.htm
non so se è quello che serve (non era il suo caso) magari funziona. dovrebbe essere cmq abbastanza comprensibile.
Originally posted by "matpez"
Proprio non avete idee a proposito ??? :(
Torneo con con VBA su Pentium IV 2.4GH. :cool:
Con codici compilati puoi ridurre il tempo a un decimo e scalare sul clock della macchina.
Interessa ? :)
Originally posted by "a2000"
Torneo con con VBA su Pentium IV 2.4GH. :cool:
Con codici compilati puoi ridurre il tempo a un decimo e scalare sul clock della macchina.
Interessa ? :)
Sembra interessante....passa passa :)
ah, dimenticavo ... 19 righe di codice[/siz] :D
Originally posted by "matpez"
Sembra interessante....passa passa :)
OK. domani ce l'hai. :cool:
adesso devo andare a mettere la batteria nel trattorino .... bruumm, brummm (... cuore di papà). :D :D
Grazie mille...è veramente molto imporatante :)
albertotisi
08-05-2003, 20:39
Originally posted by "a2000"
OK. domani ce l'hai. :cool:
adesso devo andare a mettere la batteria nel trattorino .... bruumm, brummm (... cuore di papà). :D :D
In sole 19 righe? Incredibile...
Davvero molto interessante....
Ma sei sicuro che faccia il calendario e non solo le combinazioni o le disposizioni del giocatori???
voglio troppoo vederlo :)
UP....ricordati :p , scusa se ti rompo le balle ma mi serve veramente e al più presto :)
dr.stein
09-05-2003, 09:10
interessato anche io! :)
robnet77
09-05-2003, 09:17
Originally posted by "matpez"
UP....ricordati :p , scusa se ti rompo le balle ma mi serve veramente e al più presto :)
hai un pvt, grazie! :)
[/siz] :p
eccovi il supertorneificio[/siz] !
Runnate e divertitevi tutti.
:)
... e naturalmente, come promesso, il codice main in sole 19 righe !
Lo si puo avere anche più incapsulato per l'uso come subroutine autonoma, con doppio carburatore, vernice metallizzata, ABS e controscappellamento destro e sinistro. :D
Sub aTorneo()
Call LeggiDati 'legge N, ridimensiona Nome(), Part() e legge Nome()
For k = 0 To N2 - 1
iPart = 1
iMax = Int(N2 - 1 - k / 2)
For i = 0 To iMax
j = i + k
Part(iPart, 1, 2) = N - j: Part(iPart, 1, 1) = i + 1
Part(iPart, 2, 2) = N - i: Part(iPart, 2, 1) = j + 1: iPart = iPart + 1
Next i
i0 = N2 + k - 1
For j = 0 To N2 - 2 - iMax
i = -j + i0
Part(iPart, 1, 2) = N - j: Part(iPart, 1, 1) = i + 1
Part(iPart, 2, 2) = N - i: Part(iPart, 2, 1) = j + 1: iPart = iPart + 1
Next j
Call StampaPart(k) 'stampa le partite a coppie "simmetriche"
Next k
End Sub
poi se interessa, due parole sull'algoritmo.
robnet77
09-05-2003, 10:27
Originally posted by "a2000"
poi se interessa, due parole sull'algoritmo.
hai pvt :)
--poi se interessa, due parole sull'algoritmo.
Boh...a me sembra fatto decisamente bene, c:\ongrtlns! :D
due parole, prima che me lo vada a guardare (ora non posso) secondo me sono utili, così risparmio tempo. Thx.
Come prima impressione sembra bella :)
Ora analizzo!!
Cmq le righe dai sono un po' di +, hai messo + istruzioni suella stessa riga :p
Originally posted by "matpez"
Come prima impressione sembra bella :)
Ora analizzo!!
Cmq le righe dai sono un po' di +, hai messo + istruzioni suella stessa riga :p
[color=violet][color] :p
se poi l'analizzi !
per le righe, guarda ... si potrebbe fare un'istruzione per riga e ridurre tutto a ... mi voglio rovinare: 12 righe/istruzioni (forse meno) !
ma sai com'è, mi piacciono i trenini: :pig: : :pig: : :pig: : :pig: : :pig:
:)
Anallizzato, per me sembra ottimo, voi che ne dite ???
:p :p :p :p :p :p :p
c'è un problema di RIDONDANZA :(
Se riesci a correggerlo è il seguente...
Faccio Esempi, notare che l'errore è sempre all'ultima giornata (o quasi):
4 Giocatori: A, B, C, D
Calendario (giornate):
1°: A - D e B - C
2°: A - C e C - D
3°: B - D e A - B
Come potete vedere nella 2° e 3° giornata giocana contemporaneamente C nella 2° e B nella 3°, come fa, ha il dono dell'obliquità???
4 Giocatori: A, B, C, D, E, F
Calendario (giornate):
1°: A - F e B - E e C - D
2°: A - E e B - D e D - F
3°: B - F e C - E e A - C
4°: A - D e B - C e E - F
5°: C - F e D - E e A - B
Controllate voiu ma qui ci vogliono i santi per fare questo girone ;)
IDEE A PROPOSITO???
Tu hai usato unmetodo di traslazione , uno verso il basso e l'altro verso l'alto...però c'è un punto in cui si INCROCIANO, magari prova a farti uno storico delle partite e se il tuo codice lo trova (sia A - B oppure B - A sono da cercare) non crea quel match!!
Prova o magari hai idee migliori
Avevo fatto anche io un algoritmo...ma mi andava nel pallone nel caso di un numero dispari di coppie...
Pure io ma ho deciso che in caso di numero dispari metto un ### a coprire un giocatorem cosi da formare coppie giuste, chi si trova ### salta il turno quel giorno :)
Magari prova a vedere se il tuo va cionci aggiungendo un campo fittizio, se funziona tutto me lo potresti fare vedere ???
grazie 1000
Originally posted by "matpez"
Pure io ma ho deciso che in caso di numero dispari metto un ### a coprire un giocatorem cosi da formare coppie giuste, chi si trova ### salta il turno quel giorno :)
Non un numero di giocatori dispari...ma un numero di coppie dispari...
Ma nn esiste un algoritmo matematico o di calcolo di probabilità che permetta (non l'estrazione casuale) ma un struttura logica da potere applicare anche all'informatica ???
Sicuramente...ma non lo conosco ;)
a2000, cosa dici tu a riguardo??? :p
ohhh, quanto chiasso per un piccolo bug .... :D
ora, per vostra punizione e delizia vi mando la versione corretta ma, visto che siete stati così poco confident, ho deciso di strafare e, come minacciato, ho ridotto il codice main a solo 10 righe/istruzioni ![/siz] :cool:
Sub aTorneo()
Call LeggiDati 'legge N, ridimensiona Nome(), Part() e legge Nome()
For i = 1 To N1
Part(i, 1) = i + 1
For j = 2 To N1
Part(i, j) = Part(i, j - 1) - 1: If Part(i, j) < 2 Then Part(i, j) = N
Next j
Next i
Call StampaPart 'stampa le partite
End Sub
, anche con qualche plo ... :p
matpez, non ti preoccupare, l'algoritmo c'è, è quello che ti serve, è semplice, robusto e in piena attività (vedi allegato)!
:)
non vorrei dire scemenze:
l'algoritmo è quello delle disposizioni senza ripetizioni
di n elementi (le squadre)
su k posti (numero di partite x2)
esempio 4 squadre (se sono 5 una rimane fuori)
...
ABCDEFGH (giornata 1)
BCDEFGHA (giornata 2)
...
le partite vengono vengono prese per coppie successive dalle sequenze:
A-B C-D E-F...
B-C D-E F-G...
Cosi facendo il numero delle disposizioni coincide con il numero delle giornate.(questo serve come verifica che l'algoritmo sia quello giusto)
;)
Il numero di partite per giornata si può
ricavare con una divisione intera per 2(cosi da gestire numeri dispari di squadre)
5/2 =2 (se la divisione è intera)
Una volta creata la sequenza di partite del calendario(che ha sempre lo stesso ordine)
la rimescoli a random.
Esempio calendario di serie A:
Generi una sequenza random di numeri interi da 1 a 34
4 7 1 32 etc
4 corrisponde alla quarta giornata della sequenza ordinata che nel tuo
calendario reale è la prima etc.
Cosi da generare calendari a cacchio :D
Se invece il torneo è di tennis, il problema è banale.
Il numero di giocatori deve essere necessariamente una potenza intera di 2.
Generi una sequenza random di n numeri interi (dopo aver attribuito
ad ogni giocatore il suo numero),ed estrai successivamente a coppie.
tutto quà. ;)
Sembra tutto aposto...grazie 1000 :p , e w la prugna!!!!!!!!!!!
Originally posted by "verloc"
non vorrei dire scemenze:
l'algoritmo è quello delle disposizioni senza ripetizioni
di n elementi (le squadre)
su k posti (numero di partite x2)
....
no:
Dnk = n! / (n-k)!
casomai combinazioni senza ripetizione:
Cnk = n!/[(n-k)! k!]
Cn2 = n(n-1)/2 = n°giornate (n-1) * n°partite (n/2)
tra queste coppie (partite) devi ricavare (n-1) gruppi da n/2 elementi (giornate) ma ... con certi criteri ... :cool:
tutto qua (senza accento). :D
comunque, se vuoi un indizio non a caso in Teoria dei Grafi si chiamano Tornei circolari ... :p
Originally posted by "matpez"
Sembra tutto aposto...grazie 1000 :p , e w la prugna!!!!!!!!!!!
ma grazie 1000 o grazie a2000 ?
in ogni caso [color=violet][color] :p
Originally posted by "a2000"
no:
Dnk = n! / (n-k)!
casomai combinazioni senza ripetizione:
Cnk = n!/[(n-k)! k!]
Cn2 = n(n-1)/2 = n°giornate (n-1) * n°partite (n/2)
tra queste coppie (partite) devi ricavare (n-1) gruppi da n/2 elementi (giornate) ma ... con certi criteri ... :cool:
tutto qua (senza accento). :D
infatti ho detto una grandissima str****ta :muro:
m'ero appena alzato :D
per gli amanti (giustamente) delle interfacce, e per maggiore semplicità (ancora) mi piace questa nuova versione.
La Sub principale, dato il numero N di squadre, restituisce in una matrice Part(iG, iP, 1|2) gli indici numerici della coppia di squadre della partita iP alla giornata iG:
Sub Torneo(N, Part() As Integer)
N1 = N - 1
For i = 1 To N1
j1 = i - 1: j2 = i + 1
For iP = 1 To N / 2
j1 = j1 + 1: If j1 > N1 Then j1 = 1
j2 = j2 - 1: If j2 < 1 Then j2 = N1
Part(i, iP, 1) = j1: Part(i, iP, 2) = j2
Next iP
Part(i, 1, 2) = N
Next i
End Sub
L'algoritmo è self-explaining se si leggono in successione la prima e la seconda colonna di squadre per ogni giornata.
Giro girotondo, quanto è bello il mondo .... :o :o
:)
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.