Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Stefano Nasini
La solución de un sudoku siempre es un cuadrado latino, es decir, una matriz de n×n elementos, en la
que cada casilla está ocupada por uno de los n símbolos de tal modo que cada uno de ellos aparece
exactamente una vez en cada columna y en cada fila, aunque el recíproco en general no es cierto ya que el
sudoku establece la restricción añadida de que no se puede repetir un mismo número en una región.
Para costruir un modelo de optimizaciòn que nos permita solucionar un Sudoku hace falta convertir
en costricciones de un problema de programaciòn matematica las que son las reglas del juego.
Dichas reglas son rellenar una cuadrícula de 9 × 9 celdas (81 casillas) dividida en subcuadrículas de
3 × 3 (también llamadas "cajas" o "regiones") con las cifras del 1 al 9 partiendo de algunos números ya
dispuestos en algunas de las celdas. El sudoku que querriamos solucionar es el siguiente:
Antes que todo, nuestras variables de deciciones han de ser variables binarias que nos informan de la
presencia o absencia de una cifra en una casilla. Asì que dicha variable de deciciòn estarà definida por tres
subindices: fila, columna, digito, y tomaràvalor 1 en el caso en el que en una determinada casilla
(identificada por sus coordenadas) hay un determinado digito.
Imponemos que en cada celda solo haya un digito y no màs.
1
9
∑ Cell
c =1
abc =1
Imponemos que un digito de 0 a 9 aparezca solo una vez por cada fila.
∑ Cell
a =1
abc =1
Imponemos que un digito de 0 a 9 aparezca solo una vez por cada columna.
∑ Cell
b =1
abc =1
3 3
∑∑ Cell
a =1 b =1
abc =1
Imponemos que en un cuadrado 3x3 un dado digito aparezca una sola vez.
3 3 3 6 3 9
∑∑ Cellabc = 1
a =1 b =1
∑∑ Cellabc = 1
a =1 b = 4
∑∑ Cell
a =1 b = 7
abc =1
6 3 6 6 6 7
∑∑ Cell
a = 4 b =1
abc =1 ∑∑ Cell
a =4 b=4
abc =1 ∑∑ Cell
a = 4 b =7
abc =1
9 3 7 6 9 9
∑∑ Cell
a = 7 b =1
abc =1 ∑∑ Cell
a =7 b = 4
abc =1 ∑∑ Cell
a =7 b =7
abc =1
De dicho problema buscamo una cualquiera soluciòn factible, asì que no hace falta poner ninguna
funciòn objetivo. Lo implementamos en AMPL como problema de programaciòn entera de la forma
siguiente.
minimize Niente;
2
sum{a in 4..6,b in 4..6} Cell[a,b,c]=1;
En el ultimo grupo de constricciones hemos impuesto los valores predefinidos de algunas celdas,
como mostra la representaciòn grafica de la pagina anterior. Utilizando CPLEX como solver, optenemos la
siguiente soluciòn binaria de nuestro problema.
Cada matriz corresponde a una fila del sudoku. Los valores de fila de la matriz corresponden a las
columnas del sudoku y los valores en columna a cala digito que puede ser introducido. Por ejemplo el valor
Cell[1,1,1]=0 nos dice que en la celda(1,1) del sudoku el valor 1 no esta presente.
3
ampl: display Cell;
Cell [1,*,*]
: 1 2 3 4 5 6 7 8 9 :=
1 0 0 0 0 1 0 0 0 0
2 0 0 1 0 0 0 0 0 0
3 0 0 0 1 0 0 0 0 0
4 0 0 0 0 0 1 0 0 0
5 0 0 0 0 0 0 1 0 0
6 0 0 0 0 0 0 0 1 0
7 0 0 0 0 0 0 0 0 1
8 1 0 0 0 0 0 0 0 0
9 0 1 0 0 0 0 0 0 0
[2,*,*]
: 1 2 3 4 5 6 7 8 9 :=
1 0 0 0 0 0 1 0 0 0
2 0 0 0 0 0 0 1 0 0
3 0 1 0 0 0 0 0 0 0
4 1 0 0 0 0 0 0 0 0
5 0 0 0 0 0 0 0 0 1
6 0 0 0 0 1 0 0 0 0
7 0 0 1 0 0 0 0 0 0
8 0 0 0 1 0 0 0 0 0
9 0 0 0 0 0 0 0 1 0
[3,*,*]
: 1 2 3 4 5 6 7 8 9 :=
1 1 0 0 0 0 0 0 0 0
2 0 0 0 0 0 0 0 0 1
3 0 0 0 0 0 0 0 1 0
4 0 0 1 0 0 0 0 0 0
5 0 0 0 1 0 0 0 0 0
6 0 1 0 0 0 0 0 0 0
7 0 0 0 0 1 0 0 0 0
8 0 0 0 0 0 1 0 0 0
9 0 0 0 0 0 0 1 0 0
[4,*,*]
: 1 2 3 4 5 6 7 8 9 :=
1 0 0 0 0 0 0 0 1 0
2 0 0 0 0 1 0 0 0 0
3 0 0 0 0 0 0 0 0 1
4 0 0 0 0 0 0 1 0 0
5 0 0 0 0 0 1 0 0 0
6 1 0 0 0 0 0 0 0 0
7 0 0 0 1 0 0 0 0 0
8 0 1 0 0 0 0 0 0 0
9 0 0 1 0 0 0 0 0 0
[5,*,*]
: 1 2 3 4 5 6 7 8 9 :=
1 0 0 0 1 0 0 0 0 0
2 0 1 0 0 0 0 0 0 0
3 0 0 0 0 0 1 0 0 0
4 0 0 0 0 0 0 0 1 0
5 0 0 0 0 1 0 0 0 0
6 0 0 1 0 0 0 0 0 0
7 0 0 0 0 0 0 1 0 0
8 0 0 0 0 0 0 0 0 1
9 1 0 0 0 0 0 0 0 0
[6,*,*]
: 1 2 3 4 5 6 7 8 9 :=
1 0 0 0 0 0 0 1 0 0
2 1 0 0 0 0 0 0 0 0
3 0 0 1 0 0 0 0 0 0
4 0 0 0 0 0 0 0 0 1
5 0 1 0 0 0 0 0 0 0
4
6 0 0 0 1 0 0 0 0 0
7 0 0 0 0 0 0 0 1 0
8 0 0 0 0 1 0 0 0 0
9 0 0 0 0 0 1 0 0 0
[7,*,*]
: 1 2 3 4 5 6 7 8 9 :=
1 0 0 0 0 0 0 0 0 1
2 0 0 0 0 0 1 0 0 0
3 1 0 0 0 0 0 0 0 0
4 0 0 0 0 1 0 0 0 0
5 0 0 1 0 0 0 0 0 0
6 0 0 0 0 0 0 1 0 0
7 0 1 0 0 0 0 0 0 0
8 0 0 0 0 0 0 0 1 0
9 0 0 0 1 0 0 0 0 0
[8,*,*]
: 1 2 3 4 5 6 7 8 9 :=
1 0 1 0 0 0 0 0 0 0
2 0 0 0 0 0 0 0 1 0
3 0 0 0 0 0 0 1 0 0
4 0 0 0 1 0 0 0 0 0
5 1 0 0 0 0 0 0 0 0
6 0 0 0 0 0 0 0 0 1
7 0 0 0 0 0 1 0 0 0
8 0 0 1 0 0 0 0 0 0
9 0 0 0 0 1 0 0 0 0
[9,*,*]
: 1 2 3 4 5 6 7 8 9 :=
1 0 0 1 0 0 0 0 0 0
2 0 0 0 1 0 0 0 0 0
3 0 0 0 0 1 0 0 0 0
4 0 1 0 0 0 0 0 0 0
5 0 0 0 0 0 0 0 1 0
6 0 0 0 0 0 1 0 0 0
7 1 0 0 0 0 0 0 0 0
8 0 0 0 0 0 0 1 0 0
9 0 0 0 0 0 0 0 0 1
;
ampl:
5 3 4 6 7 8 9 1 2
6 7 2 1 9 5 3 4 8
1 9 8 3 4 2 5 6 7
8 5 9 7 6 1 4 2 5
4 2 6 8 5 3 7 9 1
7 1 3 9 2 4 8 5 6
9 6 1 5 3 7 2 8 4
2 8 7 4 1 9 6 3 5
3 4 5 2 8 6 1 7 9