Torneo a squadre
di Luigi Morelli
Un sistema originale per avvicinarsi alla teoria dei gra
Luigi Morelli ` E un consulente informatico. Si occupa di system & network management, ma da sempre cerca di coniugare il lato ludico di Matematica e Scienza dellInformazione.
Limpaginazione automatica di questa rivista e realizzata al ` 100% con strumenti Open Source usando OpenOffice, Emacs, BHL, LaTeX, Gimp, Inkscape e i linguaggi Lisp, Python e BASH
For copyright information about the contents of Computer Programming, please see the section Copyright at the end of each article if exists, otherwise ask authors. Infomedia contents is 2004 Infomedia and released as Creative Commons 2.5 BY-NC-ND. Turing Club content is 2004 Turing Club released as Creative Commons 2.5 BY-ND. Le informazioni di copyright sul contenuto di Computer Programming sono riportate nella sezione Copyright alla ne di ciascun articolo o vanno richieste direttamente agli autori. Il contenuto Infomedia e 2004 Infome` dia e rilasciato con Licenza Creative Commons 2.5 BYNC-ND. Il contenuto Turing Club e 2004 Turing Club ` e rilasciato con Licenza Creative Commons 2.5 BY-ND. Si applicano tutte le norme di tutela dei marchi e dei segni distintivi. ` E in ogni caso ammessa la riproduzione parziale o totale dei testi e delle immagini per scopo didattico purch e vengano integralmente citati gli autori e la completa identicazione della testata. Manoscritti e foto originali, anche se non pubblicati, non si restituiscono. Contenuto pubblicitario inferiore al 45%. La biograa dellautore riportata nellarticolo e sul sito www.infomedia.it e di norma quella disponibi` le nella stampa dellarticolo o aggiornata a cura dellautore stesso. Per aggiornarla scrivere a info@infomedia.it o farlo in autonomia allindirizzo http://mags.programmers.net/moduli/biograa
mindware
di Luigi Morelli
Torneo a squadre
Un sistema originale per avvicinarsi alla teoria dei grafi
ramai il campionato di calcio terminato, portando con s gioie e veleni; il vero tifoso tuttavia sa bene che la sua passione trover alimento anche al termine della stagione (e questa estate avremo anche il campionato europeo). Largomento che tratteremo in questa puntata rappresenta uno studio di un nostro lettore, Giuseppe Guarino, che ha presentato un proprio lavoro relativo appunto alla elaborazione di tabelloni di incontro tramite gli strumenti pi squisitamente teorici della matematica e dellinformatica.
interi q,r tali che a=bq+r. Tale operazione che permette di determinare gli interi q,r a partire da a e b, prende il nome di divisione di a per b. Chiameremo a,b,q,r rispettivamente dividendo, divisore, quoziente e resto della divisione. Facciamo subito un esempio: sia a=59 e b=7, allora si avr che 59=(7)(8)+3 da cui risulta che q=8 e r=3. Ricordiamo che un numero b un divisore di a (in formula b|a) se il resto della divisione di a per b zero. In altri termini, a divisibile per b se risulta un multiplo intero di b (in formula a=b*k con k intero). La relazione di congruenza di uso comune nella vita di tutti i giorni. Infatti, per meglio focalizzarla, potremmo pensare alla lettura dei secondi sul quadrante di un cronometro: immaginiamo un corridore in una pista e un cronometrista che osserva la lancetta del suo cronometro. Egli vedr posizionata la lancetta dei secondi sul numero 15 dopo 15 secondi dallo start, dopo 75 secondi, dopo 615 secondi, dopo 15.135 secondi e cos via ogni sessanta secondi. Questo significa che il cronometrista sta lavorando modulo 60.
Aritmetica modulare
La nascita della moderna teoria dei numeri da attribuire al matematico Carl Friedrich Gauss, il quale svilupp la nozione di congruenza gi introdotta da Eulero, Lagrange e Legendre, e la approfond fino a formulare una teoria completa. Questa relazione gode di molte delle propriet delluguaglianza tra numeri interi. Il simbolo stato introdotto da Gauss, proprio per conservare lanalogia con il simbolo =. Come per luguaglianza, nella relazione di congruenza possiamo sommare, sottrarre e moltiplicare elementi congruenti mantenendo la relazione . Questa importante relazione nellinsieme dei numeri interi definita nel modo seguente: fissato un n N (n appartenente allinsieme dei numeri naturali {1,2,3,}) possibile introdurre la relazione di congruenza modulo n: dati due interi a,b diciamo che a congruo a b modulo n (in formula anb oppure ab (mod n) ) se n un divisore di a-b. La relazione di congruenza modulo n, pertanto, identifica tra loro due interi se e solo se la loro differenza un multiplo di n. Tale relazione risulta essere una relazione di equivalenza, poich gode delle seguenti propriet: 1) riflessiva: 2) simmetrica: 3) transitiva: aa (mod n); ab (mod n) implica ba (mod n); ab (mod n) e bc (mod n) implica ac (mod n);
importante sottolineare che presa una coppia di interi a,b con b non nullo, sono univocamente individuati due
Luigi Morelli
lmorelli@infomedia.it
u un consulente informatico. Si occupa di system & network management, ma da sempre cerca di coniugare il lato ludico di Matematica e Scienza dellInformazione.
56
RUBRICHE
avr che ogni squadra effettuer 5 (pari a N-1) partite. Supponiamo ora di voler sapere quale sar la formazione avversaria (che indicheremo con y) della squadra x (con x=1,2,3,4,5) nella h-esima giornata (con h=1,2,3,4,5). Il risultato si pu ricavare dalla seguente relazione di congruenza modulo N-1. x+y h (mod N-1) Questa relazione assegna ad ogni squadra ununica rivale nella giornata h-esima, a meno che la squadra non sia contraddistinta dal numero x (ossia y=x) da cui sarebbe 2xh (mod N-1). Per essere pi chiari facciamo subito un esempio: vorremmo sapere lavversaria della squadra s3 nella 4 giornata di andata. Pertanto abbiamo: x=3, h=4, N-1=5 da cui si ha: y+3 4 (mod 5), cio y1 (mod 5). Da quanto detto si ricava che la squadra s1 incontrer la squadra s3 nella 4a giornata di campionato. Osserviamo che quanto detto verificato se consideriamo le squadre tra s1 e s5, perch lavoriamo modulo 5. Infatti se considerassimo la squadra s6 (a cui abbiamo attribuito il valore intero 6) avremmo le stesse avversarie della squadra s1, poich 61(mod 5). i,j=1,2,..,5). Osserviamo inoltre che sulla diagonale principale sono inseriti dei valori che non dovranno essere presi in considerazione, in quanto individuano incontri non possibili tra le squadre con se stesse. Essendo la matrice simmetrica, possiamo considerare solo una delle due parti uguali rispetto alla diagonale principale, ottenendo una nuova matrice in cui gli incontri tra le squadre sono considerati una sola volta (Tabella 2). Aggiungiamo ora la colonna relativa alla squadra s6 e inseriamo nelle celle di detta colonna il valore contenuto in quelle presenti sulla diagonale principale, ottenendo una nuova matrice (Tabella 3). In pseudocodice:
for i:=1 to 5 do Begin for j:=i to 5 do Begin Tab_Calendario[i,j] := (i+j) mod 5; end; Tab_Calendario[i,6] := Tab_Calendario[i,i]; end;
A questo punto, se indichiamo con 5 le celle contenenti 0 (essendo (mod 5)) e non considerando il valore contenuto nella diagonale principale, otteniamo un risultato analogo a quello rappresentato nella Tabella 4 da cui considerando tutte le coppie (i,j) in cui i identifica la riga e j la colonna, possiamo ricavare lo schema deglincontri (Tabella 5). importante ora considerare che una squadra non pu sempre giocare in casa (o sempre fuori casa), pertanto, al fine di evitare ci, possibile considerare le coppie (i,j) nel seguente modo: (i, j) =
(i, j) (j, i)
se i + j pari se i + j dispari
da cui si ricava la tabella definitiva relativa agli incontri (Tabella 6). Come si pu osservare dalla precedente tabella, non tutte le squadre giocheranno lo stesso numero di partite in casa, poich il numero di partite totale di ognuna dispari (cio 5). Tale disparit verr colmata nel girone di ritorno, nel quale saranno invertite le coppie. Per una maggior chiarezza si possono osservare le Tabelle 7 e 8. In pseudocodice, indicata con Tab la Tabella 4, la routine di visualizzazione degli incontri riportati in Tabella 6 :
For h := 1 to 5 do Begin {Stampa il numero della giornata di gioco (i)} For i := 1 to 5 do begin For j:=i+1 to 6 do if Tab[i,j] = h then begin if (i+j) mod 2 = 0 then {Stampa la coppia (i,j)} else {Stampa la coppia (j,i)} End; End; End; End; End;
mindware
TABELLA 1
Squadre 1 2 3 4 5 1 2 3 4 0 1 2 3 4 0 1 2 3 4 0 1 2 3 4 0 1 2 3 4 5 1 2 3 4 0
TABELLA 2
Squadre 1 2 3 4 5 1 2 2 3 4 3 4 0 1 4 0 1 2 3 5 1 2 3 4 0
TABELLA 3
Squadre 1 2 3 4 5 1 2 2 3 4 3 4 0 1 4 0 1 2 3 5 1 2 3 4 0 6 2 4 1 3 0
TABELLA 4
Squadre 1 2 3 4 5 1 2 3 3 4 5 4 5 1 2 5 1 2 3 4 6 2 4 1 3 5
TABELLA 5 Giornata 1 2 3 4 5 TABELLA 7 Incontri s1-s5, s2-s4, s3-s6 s1-s6, s2-s5, s3-s4 s1-s2, s3-s5, s4-s6 s1-s3, s2-s6, s4-s5 s1-s4, s2-s3, s5-s6
TABELLA 6 GIRONE DI ANDATA Giornata 1 2 3 4 5 Incontri s1-s5, s2-s4, s6-s3 s6-s1, s5-s2, s4-s3 s2-s1, s3-s5, s4-s6 s1-s3, s2-s6, s5-s4 s4-s1, s3-s2, s6-s5
GIRONE DI ANDATA Giornata 1 2 3 4 5 Incontri s1-s5, s2-s4, s6-s3 s6-s1, s5-s2, s4-s3 s2-s1, s3-s5, s4-s6 s1-s3, s2-s6, s5-s4 s4-s1, s3-s2, s6-s5 Squadra s1 s2 s3 s4 s5 s6 Casa 2 3 2 3 2 3 Fuori 3 2 3 2 3 2
na delle altre. In questo caso semplice gestire gli incontri, attribuendo una giornata di riposo a turno alle squadre partecipanti al torneo. Se volessimo ad esempio gestire un campionato con solo 5 squadre (N=5 da cui N-1=4), allora dovremmo considerarne una fittizia che chiameremo R (ad indicare la giornata di riposo) a cui attribuiremo il valore 6 (come succedeva per la squadra s6). A questo 58
punto siamo ritornati al caso precedente, ossia continuiamo a lavorare considerando il modulo 5 (Tabelle 9 e 10). Giunti a questo punto, possiamo dire che siamo perfettamente in grado di creare un tabellone contenente gli incontri tra squadre in un campionato; ci resta solo di analizzare la fase successiva, ossia la gestione delle risultanze tra gli incontri che via via si vanno a disputare. A tale
Computer Programming n. 137 - Luglio/Agosto 2004
RUBRICHE
TABELLA 8 GIRONE DI RITORNO Giornata 1 2 3 4 5 Incontri s5-s1, s4-s2, s3-s6 s1-s6, s2-s5, s3-s4 s1-s2, s5-s3, s6-s4 s3-s1, s6-s2, s4-s5 s1-s4, s2-s3, s5-s6 Squadra s1 s2 s3 s4 s5 s6 TABELLA 9 GIRONE DI ANDATA Giornata 1 2 3 4 5 Incontri s1-s5, s2-s4, R-s3 R-s1, s5-s2, s4-s3 s2-s1, s3-s5, s4-R s1-s3, s2-R, s5-s4 s4-s1, s3-s2, R-s5 Giornata 1 2 3 4 5 TABELLA 10 GIRONE DI ANDATA Incontri s1-s5, s2-s4 s5-s2, s4-s3 s2-s1, s3-s5 s1-s3, s5-s4 s4-s1, s3-s2 Riposo s3 s1 s4 s2 s5 Casa 3 2 3 2 3 2 Fuori 2 3 2 3 2 3
TABELLA 11
grafo
matrice di adiacenza
grafo
matrice di adiacenza
TABELLA 12
Immaginiamo che siano gi state disputate le prime due giornate del girone di andata, nelle quali si sono considerate, come si pu osservare nella Tabella 6, le partite individuate dalle seguenti coppie: (5,1), (4,2), (3,6), (1,6), (2,5), (3,4). Il grafo risultante con relativa matrice di adiacenza sar allora il seguente: grafo matrice di adiacenza
scopo analizzeremo un concetto fondamentale della teoria dei numeri: la teoria dei grafi.
come si pu osservare dalla Figura 1, divisa in quattro parti: due lungo le rive del fiume (contrassegnate con le lettere A e C) un isolotto (contrassegnato con D) e una parte di terra prima di una confluenza (contrassegnata con B). Le quattro zone della citt sono collegate con sette ponti, disposti come nella figura. Nel 1700, i cittadini di Knigsberg, erano soliti chieder59
mindware
FIGURA 1
FIGURA 2
Grafo equivalente
si se fosse stato possibile attraversare i sette ponti una volta sola, e ritornare al punto di partenza. In altri termini essi volevano ipoteticamente tracciare un percorso che, partendo da una qualsiasi delle quattro aree della citt, attraversasse tutti i ponti una sola volta ritornando infine al punto di partenza. Nel 1736 questo quesito fu sottoposto, sotto forma di indovinello, al grande matematico Eulero (nome italianizzato di Leonhard Euler), il quale pubblic un articolo in cui comparve il primo lavoro sui grafi. Eulero concluse che tale gioco si traduceva topologicamente nel problema di tracciare con una sola linea continua una rete chiusa, percorrendo una sola volta ogni parte del percorso. Il matematico svizzero schematizz il problema come descritto nella Figura 2, in cui le quattro zone sono rappresentate da cerchi uniti opportunamente tra loro con delle linee, le quali rappresentano i sette ponti. Tale figura geometrica composta da punti (o da cerchi come nella Figura 2) e linee. Essa non va considerata come ente geometrico, ma come rappresentazione di una relazione tra i punti considerati. Eulero, grazie appunto alla teoria dei grafi, dimostr che il problema dei ponti di Knigsberg non era risolubile. Dopo la seconda guerra mondiale, la teoria dei grafi si svilupp in modo incessante. Nata come puro scopo empirico, ebbe fino ad allora solo applicazioni in giochi matematici. Ora sappiamo che i grafi sono utili per risolvere problemi tecnici come ad esempio quello dei circuiti elettrici e problemi decisionali, come quello della connessione
TABELLA 13
in rete tra calcolatori, della determinazione del percorso pi breve tra svariate localit, dellassegnazione di un insieme di operazioni ad un insieme di macchine, ecc.
s1
(1,2) = V
s2
s1
(1,2) = P
s2
s1
(1,2) = X
s2
s1
(1,2) = V, (2,1) = P
s2
La squadra s1 ha vinto fuori casa con la squadra s2 e la squadra s2 ha perso fuori casa con la squadra s1. In definitiva s1 totalizza due vittorie La squadra s1 ha pareggiato fuori casa con la squadra s2 e la squadra s2 ha perso fuori casa con la squadra s1. In definitiva s1 totalizza una vittoria e un pareggio mentre la squadra s2 solo un pareggio
s1
(1,2) = X, (2,1) = P
s2
60
RUBRICHE
FIGURA 3
si intersecano tra loro detto grafo planare. Un esempio di grafo planare pu essere il circuito stampato di unapparecchiatura elettronica. Per ottenere dei grafi planari, a volte basta semplicemente cambiare la disposizione dei vertici. possibile rappresentare un grafo in diversi modi. Uno di questi, quello matriciale, particolarmente importante per la memorizzazione in un calcolatore. Infatti, dato il grafo G=(V, A) in cui V composto di n vertici, possibile associare ad esso una matrice (n x n) detta matrice di adiacenza in cui il generico elemento mi,j definito nel seguente modo: mi,j =
1 0
se (i,j) A altrimenti
In altri termini, consideriamo il valore 1 nella posizione (i, j) se esiste un arco nel grafo che collega il vertice vi con il vertice vj dove i, j valgono 1,2,3,4 e i j. Se volessimo, a questo punto, raffigurare la matrice associata alla Figura 3 si avrebbe la seguente struttura:
Come si pu notare, la matrice (4 x 4) simmetrica rispetto alla diagonale, ossia (i, j)=(j, i) per ogni i, j=1,2,3,4 con i j. Vediamo ora un altro tipo di grafo, che sar utile nella trattazione che andremo ad affrontare in seguito. Un grafo orientato (o diretto) G costituito da una coppia ordinata (V, A) dove V linsieme dei vertici e A un insieme di archi costituito da coppie ordinate di nodi. Mentre per i grafi non orientati la coppia (i, j)=(j, i), per i grafi orientati la coppia (i,j) designa un collegamento da i a j ma non da j a i, pertanto (i, j)(j, i). Nella rappresentazione grafica di questi tipi di grafo, larco viene raffigurato da una freccia, pertanto, presa ad esempio la coppia (i, j), diremo che larco sar uscente dal nodo vi (coda dellarco) e entrante in vj (testa). Anche per questi tipi di grafi, possibile associare una matrice di adiacenza. A differenza dei grafi non orientati, assegniamo il valore 1 nella posizione (i, j) se esiste un arco avente coda coincidente con vi e testa con vj, in alternativa assegniamo 0. Per maggior chiarezza, si osservino gli esempi riportati in Tabella 11.
Computer Programming n. 137 - Luglio/Agosto 2004
FIGURA 4
61
mindware
RUBRICHE
rata. La seconda riga della tabella, identificata dalla coppia (2,j), con j=1,3,4,5,6, contiene tutti gli esiti degli scontri disputati fuori casa dalla squadra 2. Nella somma dovremo tener conto di tutti gli incontri in cui la relativa squadra di casa ha perso o ha pareggiato, ossia dovremo considerare i valori 1 e 3 contenuti nella riga considerata. In pseudocodice, indicata con TabEsiti la matrice contenente gli esiti delle partite, si ha il seguente algoritmo:
for h:=1 to 6 SOMMA:=0; for i:=1 to 6 do Begin if TabEsiti[i,h] > 0 then SOMMA := SOMMA + TabEsiti [i,h]; End; end; for i:=1 to 6 do Begin if TabEsiti [h,i] = -3 then SOMMA := SOMMA +3; else if TabEsiti [h,i] = 1 then SOMMA := SOMMA +1; End; End;
FIGURA 5
cia rappresentata sul grafo, come rappresentato nella Tabella 13. Come per i casi precedenti possibile creare una matrice di adiacenza associata al grafo creato. Resta solo da definire un criterio per il riempimento delle celle dalla matrice. Per fare ci, potremmo come nel caso del campionato di calcio allitaliana, associare il numero 1 per le partite pareggiate e il numero 3 per le vinte, con la variante di indicare 3 per le partite non vinte. Per effettuare il conteggio dei punti per ogni squadra non ci rester altro che applicare la seguente regola: per ogni squadra sh con h=1,2,..,n la sommatoria S dei punti accumulati data da: n S= i=1 con (i, h) = (i, h) + j=1 n (h, j)
A questo punto possibile, anzich stampare la somma, inserire il valore trovato nella seconda riga di una tabella (2 x n). Tale tabella dovr contenere nella prima riga il progressivo delle squadre. In questo modo effettuando un ordinamento decrescente rispetto alla riga 2 sar possibile stampare la classifica dei punteggi. In pseudocodice, indicata con TabClass la tabella contenente i punteggi per squadra, si ha:
for i:=1 to 5 for j:=i+1 to 6 if TabClass[2,j] > TabClass[2,i] then [invertire le celle di riga 1 e 2 della tabella] End; end; end;
(i, j) =
{ {
(i, h) 0
Conclusioni
Come avete visto, Giuseppe Guarino ci ha proposto una puntata molto ricca ed interessante, un sistema pratico un po differente per avvicinarsi alla teoria dei grafi. Per questo mese tutto, arrivederci al prossimo mese con una sorpresa: gli interventi di due lettori che hanno cercato di approfondire gli spunti di riflessione proposti nella puntata intitolata 153.
3 1 0
In altre parole, se volessimo sapere i punti accumulati ad esempio della squadra s2 lavorando sulla matrice di adiacenza dovremmo: a) sommare tutti i valori positivi della colonna 2; b) sommare tutti i valori uguali a 1 nella riga 2; c) sommare, cambiando di segno, tutti i numeri negativi della stessa riga 2. Infatti la seconda colonna della tabella identificata dalla coppia (i,2), con i=1,3,4,5,6, contiene tutti gli esiti degli scontri disputati in casa dalla squadra n. 2. Nella somma, dovremo tener conto di tutti gli incontri in cui la squadra 2 ha vinto o ha pareggiato, pertanto siamo interessati ai valori 1 e 3 contenuti nella colonna conside62