Torna alla pagina di Ricerca Operativa
:: Ricerca Operativa - PLI - Arbitri - 27.06.06 ::
Testo del problema
In seguito allo scandalo sulle designazioni arbitrali truccate, la Lega Calcio ha deciso di inaugurare un nuovo sistema, affidando ad un algoritmo di ottimizzazione le designazioni degli arbitri per i campionati di calcio. Noto il calendario delle partite e noto un insieme di arbitri disponibili, si vuole assegnare un arbitro ad ogni partita. Ovviamente lo stesso arbitro non può arbitrare più di una partita nella stessa giornata di campionato; inoltre ogni partita ha bisogno di un solo arbitro (non si considerano qui i guardalinee ed il “quarto uomo”).
Per garantire equità si vuole che il numero complessivo di volte che ogni arbitro viene assegnato ad ogni squadra sia il più uniforme possibile. In altri termini si vuole minimizzare la differenza tra il massimo ed il minimo numero di volte che uno degli arbitri viene assegnato ad una delle squadre nell’arco di tutto il campionato.
Formulare il problema, classificarlo e risolverlo con i dati del file ARBITRI.TXT, discutendo l’ottimalità e l’unicità della soluzione ottenuta.
Dati
Considerare un mini-campionato giocato da 6 squadre in un unico girone
all'italiana. Il calendario è il seguente:
Giornata 1
AAA - FFF
BBB - EEE
CCC - DDD
Giornata 2
AAA - DDD
BBB - FFF
CCC - EEE
Giornata 3
AAA - BBB
CCC - FFF
DDD - EEE
Giornata 4
AAA - EEE
BBB - CCC
DDD - FFF
Giornata 5
AAA - CCC
BBB - DDD
EEE - FFF
Si consideri il caso con 3 arbitri
Formulazione del problema
Dati
- nSquad = 6 (numero di squadre nel campionato)
- nGiorn = 5 (numero di giornate di campionato)
- nArbitri = 3 (numero arbitri)
- giornataijw (indica quali squadre w=1..6 giocano nella partita j=1..3 della giornata i=1..5) (nota: le partite sono 3 perché il numero di squadre è 6, quindi due per partita viene 3)
Variabili
- xijk (indica se l'arbitro k=1..3 è assegnato alla partita j=1..3 nella giornata i=1..5)
La variabile è binaria.
Funzione obiettivo
Si vuole minimizzare la differenza tra il massimo e il minimo numero di volte in cui un arbitro viene assegnato ad una squadra nell'arco dell'intero campionato. Introduciamo le variabili ausiliarie maxn e minn che definiremo poi nei vincoli:
min maxn - minn
Vincoli
- vincolo perché ci sia un arbitro per ogni partita j di ogni giornata i:
(somma)k xijk = 1 (per ogni i e per ogni j)
- vincolo perché lo stesso arbitro k non possa essere assegnato a più di una partita j in una stessa giornata i:
(somma)j xijk <= 1 (per ogni k e per ogni i)
- vincolo per definire maxn, ovvero il massimo numero di volte in cui un arbitro viene assegnato ad una squadra nell'arco dell'intero campionato:
maxn >= (somma)i (somma)j giornataijw * xijk (per ogni w e per ogni k)
- vincolo per definire minn, ovvero il minimo numero di volte in cui un arbitro viene assegnato ad una squadra nell'arco dell'intero campionato:
minn <= (somma)i (somma)j giornataijw * xijk (per ogni w e per ogni k)
Linghizzazione del problema
! problema - Arbitri;
model:
sets:
squadra /1..6/;
giornata /1..5/;
arbitro /1..3/;
partita /1..3/;
assegnamento (giornata,partita,arbitro): x;
calendario (giornata,partita,squadra): cal;
endsets
data:
cal =
1 0 0 0 0 1
0 1 0 0 1 0
0 0 1 1 0 0
1 0 0 1 0 0
0 1 0 0 0 1
0 0 1 0 1 0
1 1 0 0 0 0
0 0 1 0 0 1
0 0 0 1 1 0
1 0 0 0 1 0
0 1 1 0 0 0
0 0 0 1 0 1
1 0 1 0 0 0
0 1 0 1 0 0
0 0 0 0 1 1;
enddata
! funzione obiettivo;
min = maxn - minn;
! deve esserci un arbitro per ogni partita;
@for(giornata(i):
@for(partita(j):
@sum(arbitro(k): x(i,j,k)) = 1
)
);
! un arbitro non può essere assegnato a più partite la stessa giornata;
@for(arbitro(k):
@for(giornata(i):
@sum(partita(j): x(i,j,k)) <= 1
)
);
! definiamo maxn: massimo numero di volte in cui un arbitro è assegnato
alla stessa squadra;
@for(squadra(w):
@for(arbitro(k):
maxn >= @sum(giornata(i):
@sum(partita(j):
cal(i,j,w) * x(i,j,k)
)
)
)
);
! definiamo minn: minimo numero di volte in cui un arbitro è assegnato
alla stessa squadra;
@for(squadra(w):
@for(arbitro(k):
minn <= @sum(giornata(i):
@sum(partita(j):
cal(i,j,w) * x(i,j,k)
)
)
)
);
! dichiarazione variabile binaria x;
@for(assegnamento(i,j,k): @bin(x(i,j,k)));
end
Torna alla pagina di Ricerca Operativa