Applicazione della PLI al gioco del Sudoku
Transcript
Applicazione della PLI al gioco del Sudoku
Un esempio di applicazione della programmazione lineare intera: il Sudoku Un esempio di applicazione della programmazione lineare intera: il Sudoku Corso di Ricerca Operativa per il Corso di Laurea Magistrale in Ingegneria della Sicurezza: Trasporti e Sistemi Territoriali AA 2012-2013 Prof. Marcello Sanguineti Autore: Giorgio Gnecco Università di Genova Via Opera Pia, 13 – 16145 Genova, Italy 1 / 14 Un esempio di applicazione della programmazione lineare intera: il Sudoku Risoluzione del Sudoku attraverso la PLI Nel seguito, si descrive come formulare il noto gioco del Sudoku come problema di programmazione lineare intera, individuandone variabili decisionali, vincoli e funzione obiettivo. 2 / 14 Un esempio di applicazione della programmazione lineare intera: il Sudoku Regole del Sudoku È data una tabella con 9 righe e 9 colonne. La tabella è suddivisa in 9 sottotabelle quadrate di dimensione 3 × 3. Si vuole riempire ogni sottotabella con i numeri {1,2,3,4,5,6,7,8,9}, rispettando le seguenti regole: ogni casella della tabella deve contenere uno ed un solo numero; ogni numero deve comparire una ed una sola volta in ogni riga della tabella; in ogni colonna della tabella; in ogni sottotabella; i numeri contenuti in alcune caselle della tabella sono specificati a priori. 3 / 14 Un esempio di applicazione della programmazione lineare intera: il Sudoku Individuazione delle variabili decisionali Variabili decisionali: xijk ∈ {0, 1}. Gli indici i, j e k variano da 1 a 9. xijk è uguale a 1 se e solo se il numero i compare nella tabella nell’intersezione fra la j-esima riga e la k-esima colonna, altrimenti è uguale a 0. 4 / 14 Un esempio di applicazione della programmazione lineare intera: il Sudoku Individuazione dei vincoli Vincoli: Ogni casella della tabella deve contenere uno ed un solo elemento: ∀j, k ∈ {1, . . . , 9} , 9 X xijk = 1 . i=1 Ogni numero deve comparire una ed una sola volta in ogni riga della tabella: ∀i, j ∈ {1, . . . , 9} , 9 X xijk = 1 . k=1 5 / 14 Un esempio di applicazione della programmazione lineare intera: il Sudoku Ogni numero deve comparire una ed una sola volta in ogni colonna della tabella: ∀i, k ∈ {1, . . . , 9} , 9 X xijk = 1 . j=1 Ogni numero deve comparire una ed una sola volta in ogni sottotabella: ∀i ∈ {1, . . . , 9} , ∀m, n ∈ {1, 2, 3} , 3m X 3n X xijk = 1 . j=3m−2 k=3n−2 6 / 14 Un esempio di applicazione della programmazione lineare intera: il Sudoku Alcuni elementi della tabella sono specificati a priori. Nell’esempio considerato, x153 = x166 = 1 , x216 = x231 = x299 = 1 , x311 = x339 = x342 = x385 = x398 = 1 , x471 = x484 = 1 , x522 = x588 = 1 , x619 = x626 = x655 = x694 = 1 , x744 = x779 = 1 , x825 = x857 = x891 = 1 , x912 = x968 = 1 . 7 / 14 Un esempio di applicazione della programmazione lineare intera: il Sudoku Individuazione della funzione obiettivo Funzione obiettivo: Nell’esempio considerato, si è interessati esclusivamente ad individuare una soluzione ammissibile del problema, cioè una scelta delle variabili decisionali che soddisfi tutti i vincoli illustrati in precedenza. Pertanto, si può formulare un problema di programmazione lineare intera (PLI) scegliendo una qualunque funzione obiettivo lineare. Nel seguito, si sceglierà come funzione obiettivo z = 0, che ha il vantaggio di non preferire alcuna soluzione ammissibile a qualunque altra soluzione ammissibile. 8 / 14 Un esempio di applicazione della programmazione lineare intera: il Sudoku Formulazione come problema di PLI min s.t. z =0 ∀j, k ∈ {1, . . . , 9} , 9 X xijk = 1 , i=1 ∀i, j ∈ {1, . . . , 9} , 9 X xijk = 1 , k=1 ∀i, k ∈ {1, . . . , 9} , 9 X xijk = 1 , j=1 ∀i ∈ {1, . . . , 9} , ∀m, n ∈ {1, 2, 3} , 3m X 3n X xijk = 1 , j=3m−2 k=3n−2 (continua) 9 / 14 Un esempio di applicazione della programmazione lineare intera: il Sudoku (segue dalla slide precedente) x153 = x166 = 1 , x216 = x231 = x299 = 1 , x311 = x339 = x342 = x385 = x398 = 1 , x471 = x484 = 1 , x522 = x588 = 1 , x619 = x626 = x655 = x694 = 1 , x744 = x779 = 1 , x825 = x857 = x891 = 1 , x912 = x968 = 1 , ∀i, j, k ∈ {1, . . . , 9} , xijk ∈ {0, 1} . 10 / 14 Un esempio di applicazione della programmazione lineare intera: il Sudoku Risoluzione del problema Risoluzione con un solver che impiega la PLI (http://sudoku.noisette.ch/index.php). 11 / 14 Un esempio di applicazione della programmazione lineare intera: il Sudoku Soluzione del problema ottenuta con il solver. 12 / 14 Un esempio di applicazione della programmazione lineare intera: il Sudoku Unicità della soluzione? Metodo per verificare o meno l’unicità della soluzione In questo problema specifico e con la scelta fatta della funzione obiettivo, l’insieme delle soluzioni ammissibili coincide con l’insieme delle soluzioni ottime. ⋆ Siano yijk := xijk le componenti di una soluzione ottima (quindi ammissibile), trovata risolvendo il problema precedente. Per verificare o meno che questa sia l’unica soluzione ammissibile del Sudoku, si introduce un nuovo vincolo nel problema, che esclude dall’insieme delle soluzioni ammissibili la sola soluzione appena trovata: 9 9 X 9 X X yijk xijk ≤ 9 · 9 − 1 = 80 . i=1 j=1 k=1 Infatti, ricordando che xijk ∈ {0, 1}, la sommatoria tripla precedente è uguale a 81 se e solo se xijk = yijk per ogni i, j e k. 13 / 14 Un esempio di applicazione della programmazione lineare intera: il Sudoku Bibliografia The Mathematics of Sudoku: http://en.wikipedia.org/wiki/Mathematics_of_Sudoku. P. Saengudomlert: Optimization for Communications and Networks, CRC Press, 2012, pp. 146-148. 14 / 14