Universidade Federal de Ouro PretoDepartamento de Computação
Prof. Haroldo Gambini SantosD.Sc. Computer Science
BacktrackingBusca com Retrocesso
Busca Combinatória
Para vários problemas estamos dispostos a gastar muito processamento na obtenção da solução exata
Ex.: testar um programa ou circuito para todas as entradas possíveis e verificar sua corretude
Aproveitando sua CPU
Computadores com ciclos em Gigahertz são baratosEm que isso ajuda:
bilhões de operações por segundocomputação de uma solução toma centenas/milhares de ciclosmilhões de soluções:
permutações de 10, 11 elementoscombinações de 20 elementos
solucionar problemas muito maiores que isso envolve a poda cuidadosa do espaço de soluções
Backtracking
Maneira sistemática de iterar por todas as possíveis configurações no espaço de soluções
Ex.:possíveis permutações de objetospossíveis coleções de elementos (subconjuntos)todas as árvores de cobrimentotodos os caminhos entre dois vérticespodas as partições possíveis de vértices em cores
Modelagem
Solução, vetora = (a1, a2, …, an )
Cada elemento ai vem de um conjunto Si de valores possíveis
O método trabalha com soluções parciais que são estendidas
A cada passo:checar se a solução está completachecar as maneiras de estender a solução no passo k seguinte (construir Sk)
Backtrack-DFS
Backtrack-DFS( A, k )if A = ( a1, a2, … an ) is a solution then report it.
elsek = k + 1compute Sk
while Sk ≠ ⌀
ak = an element from Sk
Sk = Sk \ {ak}
Backtrack-DFS( A, k )
Busca
DFS – Busca em ProfundidadeSolução representada pelo caminho entre raiz e nó folhaRequerimento de espaço: altura da árvore
BFS – Busca em LarguraEspaço: largura da árvore !
Implementação
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; // if early termination
}
}
}
c não pode ser global!
dependentesdo
problema
Poda (pruning) por Infactibilidade
2
54
3
7
6
1
11
10
8
9
Ex: TSP
nenhuma rota que vá da cidade 1 imediatamente paraa 3 precisa ser enumerada
Podas (cont.)
Poda por Limite (Branch-&-Bound): Caso já se conheça uma rota com custo Ct , qualquer solução parcial com custo maior pode ser podada
Podar simetria:Depois de explorar todas as rotas iniciando em v1 temos que explorar todas as iniciando em v2 ?
impacto: (n-1)! rotas
Backtracking – Problemas de Satisfação de Restrições: 8 rainhas
Backtracking – Problemas de Satisfação de Restrições: Kakuro
Tarefa de Casa: Resolvedores de n-Rainhas e Kakuro
Desenvolver resolvedores em C, Java ou C++, usando o template apresentado anteriormente
n-Rainhas:entrada: n parâmetro da linha de comandosaída: solução impressa/desenhada
Kakuro:Entrada: arquivo texto:
saída: solução impressa/desenhada