1 Algoritmos Tentativa e Erro (Backtracking) Prof.: Jonas Potros
Tentativa e Erro 2 Tentativa e erro: decompor o processo em um número finito de subtarefas parciais que devem ser exploradas exaustivamente. O processo de tentativa gradualmente constrói e percorre uma árvore de subtarefas.
Tentativa e Erro 3 Passos: Escolher uma operação plausível; Executar a operação com os dados; Se a meta não foi alcançada, repita o processo até que se atinja a meta ou se evidencie a insolubilidade do problema. Algoritmos tentativa e erro não seguem regra fixa de computação: Passos em direção à solução final são testados e registrados; Caso esses passos tomados não levem à solução final, eles podem ser retirados e apagados do registro.
Tentativa e Erro 4 Quando a pesquisa na árvore de soluções cresce rapidamente, sendo preciso usar algoritmos aproximados ou heurísticas que não garantem a solução ótima mas são rápidos. Tentativa e erro é uma técnica que utiliza recursividade. Esta pode ser usada para resolver problemas cuja solução é do tipo tentar todas as alternativas possíveis.
Exemplo: Labirinto 5 Em cada interseção, você tem que decidir se: Segue direto Vai à esquerda Vai à direita Você não tem informação suficiente para escolher corretamente; Cada escolha leva a outro conjunto de escolhas; Uma ou mais sequência de escolhas pode ser a solução.
Exemplo: Passeio do Cavalo 6 Tabuleiro com n x n posições: cavalo movimenta-se segundo as regras do xadrez (parece a letra L). Problema: a partir de (, ), encontrar, se existir, um passeio do cavalo com n² - 1 movimentos, tal que todos os pontos do tabuleiro são visitados uma única vez.
Backtracking 7 Técnica em procedimentos de busca que corresponde ao retorno de uma exploração. Ex: Busca-em-Profundidade Quando chegamos a um nó v pela primeira vez, cada aresta incidente a v é explorada e então o controle volta (backtracks) ao nó a partir do qual v foi alcançado.
Código 8 bool finished = FALSE ; backtrack ( int a[], int k,data input ) { int ncandidates, i, c[maxcandidates]; if (is_a_solution(a, k, input ) ) process_solution(a,k,input ); else { ++k; } } construct_candidates(a, k, input, c, &ncandidates ); for (i=0 ;i < ncandidates; ++i ) { a[k] =c[i]; make_move(a, k, input ); } backtrack(a, k, input ); undo_move(a, k, input ); if(finished ) return ; // Final C não pode ser global Depende do problema
Exemplo: Kakuro 9 Jogo de raciocínio lógico, considerado mais difícil que o Sudoku. É um desafio aliciante para quem aprecia Sudoku. Joga-se igualmente com números, de 1 a 9, não podendo repetir os valores na linha nem na coluna. Requer perícia, prática e muita paciência.
Problemas de Satisfação de Restrições 10 Um Problemas de Satisfação de Restrições é definido por: um conjunto de variáveis de decisão {,,, } um conjunto de restrições {,,, } um domínio de valores possíveis, para cada variável, com i =1,..., n; Uma solução ao PSR é quando todas as variáveis possuem valores dentro de seus domínios e nenhuma restrição é violada.
Exemplo: Coloração de Mapas 11 Variáveis: WA, NT, Q, NSW, V, SA, T Domínio: = { vermelho, verde, azul } i = 1,, 7 Restrições: Regiões vizinhas devem ter cores diferentes
Exemplo: Coloração de Mapas 12 Obs.: Tasmânia é um subproblema independente; Como identificar que existem problemas independentes? Componentes fortemente conectados...
Exemplo: Coloração de Mapas 13 Soluções: São atribuições que satisfazem todas as restrições Ex.: { WA=vermelho, NT=verde, Q=vermelho, NSW=verde, Victoria=vermelho, SA=azul, T=verde }
Exemplo: Árvore de Busca Coloração de Mapas 14
Especialização do Backtracking 15 Forward-checking (VERIFICAÇÃO PRÉVIA) Em um PSR, uma maneira de utilizar melhor as restrições durante a busca é a chamada verificação prévia (forward-checking); Sempre que uma variável X é atribuída, o processo de verificação prévia examina cada variável não atribuída Y que está conectada a X por uma restrição; A partir daí, é excluído do domínio de X, qualquer valor que esteja inconsistente com o valor escolhido para Y;
Forward-checking 16
Forward-checking 17
Forward-checking 18
Forward-checking 19
Forward-checking 20
Forward-checking 21
Forward-checking 22
Problema das N-Rainhas Definição Colocar N rainhas em um tabuleiro N x N de forma que nenhuma seja atacada pelas outras. A forma geral de uma solução é uma permutação de um vetor de inteiros [1,..., N]. A solução para o problema de 8 rainhas mostrada abaixo é representada pelo vetor [4, 2, 7, 3, 6, 8, 5, 1].
Exercício: Problema das N-Rainhas 24