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