PDA

View Full Version : Algoritmo per calendario tornei!!!


matpez
08-05-2003, 00:57
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:

matpez
08-05-2003, 15:33
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])
}
}

atragon
08-05-2003, 16:07
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.

a2000
08-05-2003, 16:37
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 ? :)

matpez
08-05-2003, 16:42
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 :)

a2000
08-05-2003, 16:43
ah, dimenticavo ... 19 righe di codice[/siz] :D

a2000
08-05-2003, 16:48
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

matpez
08-05-2003, 17:57
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....

matpez
08-05-2003, 21:39
Ma sei sicuro che faccia il calendario e non solo le combinazioni o le disposizioni del giocatori???

voglio troppoo vederlo :)

matpez
09-05-2003, 09:05
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! :)

a2000
09-05-2003, 09:41
[/siz] :p

eccovi il supertorneificio[/siz] !

Runnate e divertitevi tutti.

:)

a2000
09-05-2003, 09:47
... 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

a2000
09-05-2003, 09:49
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 :)

atragon
09-05-2003, 11:00
--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.

matpez
09-05-2003, 13:09
Come prima impressione sembra bella :)

Ora analizzo!!

Cmq le righe dai sono un po' di +, hai messo + istruzioni suella stessa riga :p

a2000
09-05-2003, 13:21
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:

:)

matpez
09-05-2003, 13:39
Anallizzato, per me sembra ottimo, voi che ne dite ???

:p :p :p :p :p :p :p

matpez
09-05-2003, 15:47
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???

matpez
09-05-2003, 15:52
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

cionci
09-05-2003, 15:52
Avevo fatto anche io un algoritmo...ma mi andava nel pallone nel caso di un numero dispari di coppie...

matpez
09-05-2003, 15:56
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

cionci
09-05-2003, 16:24
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...

matpez
09-05-2003, 17:08
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 ???

cionci
09-05-2003, 17:56
Sicuramente...ma non lo conosco ;)

matpez
10-05-2003, 01:53
a2000, cosa dici tu a riguardo??? :p

a2000
10-05-2003, 02:41
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)!

:)

verloc
10-05-2003, 07:26
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)
;)

verloc
10-05-2003, 07:32
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)

verloc
10-05-2003, 07:40
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

verloc
10-05-2003, 07:57
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à. ;)

matpez
10-05-2003, 10:22
Sembra tutto aposto...grazie 1000 :p , e w la prugna!!!!!!!!!!!

a2000
10-05-2003, 10:29
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

a2000
10-05-2003, 10:33
comunque, se vuoi un indizio non a caso in Teoria dei Grafi si chiamano Tornei circolari ... :p

a2000
10-05-2003, 10:41
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

verloc
10-05-2003, 14:20
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

a2000
14-05-2003, 15:38
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

:)