Torna alla pagina di Ricerca Operativa
:: Ricerca Operativa - PLI - Arbitri - 27.06.06 ::
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.
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
La variabile è binaria.
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
! 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