Sudoku é um problema de lógica baseado na alocação de números em quebra-cabeça na forma de matriz.
O objetivo é preencher uma matriz $9 \times 9$ com números de 1 a 9 de modo que cada coluna, cada linha, e cada uma das nove $3\times3$ sub-matrizes que compõem a matriz maior contenha todos os dígitos de 1 a 9.
A resolução desse problema por meio de programação linear binária foi proposto por Bartlett, Chartier, Langville e Rankin (2008)
Considere um problema Sudoku de dimensão $4\times 4$, nesse caso temos para cada sub-matriz 2 linhas e 2 colunas representadas por $m=2$. O grau do problema é dado por a $n=m^2$, aqui temos então $n=4$. Visualmente, temos:
Nesse problema temos que preencher os quadrados faltantes com números de 1 a 4, de modo que em nenhuma linha ou coluna da matriz superior contenha números repetidos, além do mais, cada sub-matriz também não deve possuir números repetidos.
Claramente essas condições formam as restrições do nosso problema de programação linear binária, podemos sintetizá-las da seguinte forma:
- Cada coluna contém somente uma entrada $k$ onde $1\le k\le n$.
- Cada linha contém somente uma entrada $k$ onde $1\le k\le n$.
- Todos os espaços vazios devem ser completados.
- Algumas entradas do quebra-cabeça são conhecidas desde o início. Isto pode ser indicado como uma sequência de valores $x_{ijk}=1$, onde $1\le i,j,k \le n$.
- Cada sub-matriz deve conter exatamente um dos $n$ possíveis dígitos.
Matematicamente podemos representar o problema da seguinte forma:
$ Minimize Z=0x111+0x112+⋯+0xnnnSujeito a:n∑i=1xijk=1 para j=1,…,n e k=1,…,n. (Apenas um k em cada coluna.) n∑j=1xijk=1, para i=1,…,n e k=1,…,n (Apenas um k em cada linha.) mq∑j=mq−m+1mq∑i=mq−m+1xijk=1, para k=1,…,n , p=1,…,m e q=1,…,m (Somente um k em cada sub-matriz.) xijk=1 para todo elemento (i,j,k) já preenchido na tabela.n∑k=1xijk=1, para i=1,…,n e j=1,…,n (Todas as posições da matriz devem ser preenchidas.)xijké binário para 1≤i,j,k≤n$
onde $x_{ijk}$ representa o elemento $(i,j)$ da matriz superior assumindo o valor igual a $k$. Para resolver podemos usar o pacote lpSolve.