Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Sudoku é um problema NP-Completo

Sudoku é um problema NP-Completo

Pedro Vereza

June 01, 2015
Tweet

More Decks by Pedro Vereza

Other Decks in Education

Transcript

  1. Sudoku é um problema NP-Completo Pedro Gabriel de Souza Vereza

    Medeiros INF05515 Complexidade de Algoritmos Universidade Federal do Rio Grande do Sul
  2. Sudoku • Matriz n2 x n2 • n2 submatrizes com

    tamanho n x n • Posições aleatórias com números entre 0…n2-1 • Objetivo: todas as colunas, linhas e submatrizes possuem valores entre 0…n2-1 exatamente uma vez. • Lista de problemas NP-Completos (Kendall et al., 2008)
  3. Sudoku 0 3 8 6 0 6 0 2 4

    8 0 3 0 1 5 3 6 8 1 8 1 2 6 0 1 2 3 4 5 6 7 8 3 4 5 6 7 8 0 1 2 6 7 8 0 1 2 3 4 5 1 2 3 4 5 6 7 8 0 4 5 6 7 8 0 1 2 3 7 8 0 1 2 3 4 5 6 2 3 4 5 6 7 8 0 1 5 6 7 8 0 1 2 3 4 8 0 1 2 3 4 5 6 7
  4. Sudoku é NP-completo se: • Existe um algoritmo de verificação

    em tempo polinomial. • Existe um problema NP-Hard cujas instâncias podem ser reduzidas à instâncias de Sudoku
  5. Verificação verify(int[][] instance, int[][] certificate) int subMatrixSize = sqrt(instance.size); int

    n = instance.size int values[]; for i = 0 until n-1 do values = new int[n] //Todos os valores de values são zero na criação for j = 0 until n-1 do if (instance[i][j] != BLANK && instance[i][j] != certificate[i][j]) return invalid if (certificate[i][j] == BLANK || values[certificate[i][j]] == 1) return invalid values[certificate[i][j] == 1 endfor endfor
  6. Verificação for j = 0 until n-1 do values =

    new int[n] for i = 0 until n-1 do if (values[certificate[i][j]] == 1) return invalid values[certificate[i][j] == 1 endfor endfor
  7. Verificação for i = 0 until n-1, i += subMatrixSize

    do for j = 0 until n-1, j += subMatrixSize do values = new int[n] for k = 0 until subMatrixSize-1 do for h = 0 until subMatrixSize-1 do if (values[certificate[i + k][j + h]] == 1) return invalid values[certificate[i + k][j + h] == 1 endfor endfor return valido
  8. Verificação 0 3 8 6 0 6 0 2 4

    8 0 3 0 1 5 3 6 8 1 8 1 2 6 0 1 2 3 4 5 6 7 8 3 4 5 6 7 8 0 1 2 6 7 8 0 1 2 3 4 5 1 2 3 4 5 6 7 8 0 4 5 6 7 8 0 1 2 3 7 8 0 1 2 3 4 5 6 2 3 4 5 6 7 8 0 1 5 6 7 8 0 1 2 3 4 8 0 1 2 3 4 5 6 7 Válido
  9. Verificação 0 3 8 6 0 6 0 2 4

    8 0 3 0 1 5 3 6 8 1 8 1 2 6 0 1 2 3 4 5 6 7 8 3 4 5 6 7 8 0 1 2 6 7 8 0 1 2 3 4 5 1 2 3 4 5 6 7 8 0 4 5 6 7 8 0 1 2 3 7 8 0 1 5 3 4 5 6 2 3 4 5 6 7 8 0 1 5 6 7 8 0 1 2 3 4 8 0 1 2 3 4 5 6 7 Inválido
  10. Verificação 0 3 8 6 0 6 0 2 4

    8 0 3 0 1 5 3 6 8 1 8 1 2 6 0 1 2 3 4 5 6 7 8 3 4 5 6 7 8 0 2 6 7 8 0 1 2 3 4 5 1 2 3 4 5 6 7 8 0 5 6 7 0 1 2 3 7 8 0 1 2 3 4 5 6 2 3 4 5 6 7 8 0 1 5 6 7 8 0 1 2 4 8 0 1 2 3 4 5 6 7 Inválido
  11. Verificação 0 3 8 6 0 6 0 2 4

    8 0 3 0 1 5 3 6 8 1 8 1 2 6 6 2 3 0 4 8 7 1 5 7 1 8 2 6 5 3 4 0 0 5 4 7 1 3 8 6 2 4 6 5 8 7 2 1 0 3 2 8 0 6 3 1 4 5 7 1 3 7 4 5 0 6 2 8 3 0 1 5 8 4 2 7 6 5 4 6 3 2 7 0 8 1 8 7 2 1 0 6 5 3 4 Inválido
  12. Latin Squares • Matriz n x n • Posições aleatórias

    com números entre 0…n-1 • Objetivo: todas as colunas, linhas possuem valores entre 0…n-1 exatamente uma vez. • Problema provado NP-completo (utilizando redução a partir de 1-in-4-SAT)
  13. Redução 1 2 4 5 7 8 4 5 7

    8 1 2 7 8 1 2 4 5 1 2 3 4 5 6 7 8 0 4 5 6 7 8 0 1 2 3 7 8 0 1 2 3 4 5 6 2 3 4 5 6 7 8 0 1 5 6 7 8 0 1 2 3 4 8 0 1 2 3 4 5 6 7 L(k, j/n) * n se i = 0 e h = 0 e L(k, j/n) != Ø S(i+k, j+h) Ø se i = 0 e h = 0 e L(k, j/n) = Ø (((k+i) mod n) * n + [(k+i)/n] + j + h) mod n2 { 0 ≤ k ≤ n; 0 ≤ h < n. Posições em uma submatriz 0 ≤ j < n2 com j variando de n em n. Representa uma coluna de submatrizes 0 ≤ i < n2 com i variando de n em n. Representa uma linha de submatrizes
  14. Redução 0 2 1 1 0 1 2 4 5

    6 7 8 3 4 5 7 8 1 2 7 8 1 2 3 4 5 1 2 3 4 5 6 7 8 0 4 5 6 7 8 0 1 2 3 7 8 0 1 2 3 4 5 6 2 3 4 5 6 7 8 0 1 5 6 7 8 0 1 2 3 4 8 0 1 2 3 4 5 6 7 L(k, j/n) * n se i = 0 e h = 0 e L(k, j/n) != Ø S(i+k, j+h) Ø se i = 0 e h = 0 e L(k, j/n) = Ø (((k+i) mod n) * n + [(k+i)/n] + j + h) mod n2 { 0 ≤ k ≤ n; 0 ≤ h < n. Posições em uma submatriz 0 ≤ j < n2 com j variando de n em n. Representa uma coluna de submatrizes 0 ≤ i < n2 com i variando de n em n. Representa uma linha de submatrizes
  15. Redução 0 1 2 1 2 0 2 0 1

    0 1 2 3 4 5 6 7 8 3 4 5 6 7 8 0 1 2 6 7 8 0 1 2 3 4 5 1 2 3 4 5 6 7 8 0 4 5 6 7 8 0 1 2 3 7 8 0 1 2 3 4 5 6 2 3 4 5 6 7 8 0 1 5 6 7 8 0 1 2 3 4 8 0 1 2 3 4 5 6 7 L(k, j/n) * n se i = 0 e h = 0 e L(k, j/n) != Ø S(i+k, j+h) Ø se i = 0 e h = 0 e L(k, j/n) = Ø (((k+i) mod n) * n + [(k+i)/n] + j + h) mod n2 { 0 ≤ k ≤ n; 0 ≤ h < n. Posições em uma submatriz 0 ≤ j < n2 com j variando de n em n. Representa uma coluna de submatrizes 0 ≤ i < n2 com i variando de n em n. Representa uma linha de submatrizes Sim para ambos
  16. Redução 0 2 0 2 1 0 1 2 4

    5 6 7 8 4 5 7 8 1 2 0 7 8 6 1 2 3 4 5 1 2 3 4 5 6 7 8 0 4 5 6 7 8 0 1 2 3 7 8 0 1 2 3 4 5 6 2 3 4 5 6 7 8 0 1 5 6 7 8 0 1 2 3 4 8 0 1 2 3 4 5 6 7 L(k, j/n) * n se i = 0 e h = 0 e L(k, j/n) != Ø S(i+k, j+h) Ø se i = 0 e h = 0 e L(k, j/n) = Ø (((k+i) mod n) * n + [(k+i)/n] + j + h) mod n2 { 0 ≤ k < n; 0 ≤ h < n. Posições em uma submatriz 0 ≤ j < n2 com j variando de n em n. Representa uma coluna de submatrizes 0 ≤ i < n2 com i variando de n em n. Representa uma linha de submatrizes Não para ambos
  17. Redução int[][] toSudoku(int[][] latinSquares) { int n = latinSquares.length int[][]

    sudoku = new int[n * n][n * n] for i = 0 until (n * n)-1; i += n do for j = 0 until (n * n)-1; j += n do for k = 0 until n-1 do for h = 0 until n-1 do if (i == 0 && h == 0) do if (latinSquares[k][j / n] == BLANK) do sudoku[k + i][j + h] = BLANK else do sudoku[k + i][j + h] = (latinSquares[k][j / n]) * n endif else do sudoku[k + i][j + h] = (((k + i) % n) * n + ((k + i) / n) + j + h) % (n*n) endif endfor endfor endfor endfor return sudoku end
  18. Sudoku é NP-completo • Algoritmo de verificação em tempo polinomial

    O(n2) • Algoritmo de redução em tempo polinomial O(n4)
  19. Referências • [Kendall et al., 2008] G. Kendall, A. Parkes,

    and K. Spoerer. A survey of NP-complete puzzles. ICGA Journal,31(1):13–34, 2008 • Takayuki Yato and Takahiro Seta. Complexity and Completeness of Finding Another Solution and Its Application to Puzzles.IEICE Transactions on Fundamentals of Electronics, Communications, and Computer Sciences E86-A:5, 2003