Logo Passei Direto
Buscar

Backtracking – Wikipédia a enciclopédia livre

User badge image

Enviado por Tulio Ruzzante em

Esta é uma pré-visualização de arquivo. Entre para ver o arquivo original

Backtracking sem backjumping.
Backtracking com backjumping.
Backtracking
Origem: Wikipédia, a enciclopédia livre.
Backtracking é um tipo de algoritmo que representa um
refinamento da busca por força bruta, em que múltiplas
soluções podem ser eliminadas sem serem explicitamente
examinadas. O termo foi cunhado pelo matemático estado-
unidense D. H. Lehmer na década de 1950.
O procedimento é usado em linguagens de programação como
Prolog. Uma busca inicial em um programa nessa linguagem
segue o padrão busca em profundidade, ou seja, a árvore é
percorrida sistematicamente de cima para baixo e da esquerda
para direita. Quando essa pesquisa falha, ou é encontrado um
nodo terminal da árvore, entra em funcionamento o mecanismo
de backtracking. Esse procedimento faz com que o sistema
retorne pelo mesmo caminho percorrido com a finalidade de
encontrar soluções alternativas.
Um exemplo de algoritmo de Backtracking está representado
abaixo:
bool acabou = FALSE;
 
backtrack(int a[], int k, int n) {
 int c[MAXCANDIDATOS]; /* Candidatos para a próxima posição */
 int ncandidatos; /* Número de candidatos para a próxima posição */
 int i; /* Contador */
 
 if (e_uma_solucao(a, k, n)) {
 processar_solucao(a, k, n);
 } else {
 k = k + 1;
 construir_candidatos(a, k, n, c, &ncandidatos);
 for (i=0; i<ncandidatos; i++) {
 a[k] = c[i];
 backtrack(a, k, n);
 if (acabou) return;
 }
 }
}
As principais aplicações desse tipo de algoritmo são para a construção de todos os 2^n subconjuntos de um
conjunto S, com n elementos e todas as permutações desse conjunto. Abaixo seguem as sub-rotinas para cada
situação, na linguagem C:
Construção de todos os subconjuntos
[1]
e_uma_solucao(int a[], int k, int n) {
 return (k == n);
}
 
construir_candidatos(int a[], int k, int n, int c[], int *ncandidatos) {
 c[0] = TRUE;
 c[1] = FALSE;
 
 *ncandidatos = 2;
}
 
processar_solucao(int a[], int k) {
 int i; /* Contador */
 
 printf("{");
 for (i=1; i<=k; i++)
 if (a[i] == TRUE)
 printf(" %d", i);
 
 printf(" }\n");
}
Agora, é necessário chamar a função backtrack com os argumentos certos, sendo backtrack(a, 0, n).
Construção de todas as permutações
construir_candidatos(int a[], int k, int n, int c[], int *ncandidatos) {
 int i; /* Contador */
 bool in_perm[NMAX]; /* Quem já está na permutação? */
 
 for (i=1; i<NMAX; i++) in_perm[i] = FALSE;
 for (i=1; i<k; i++) in_perm[ a[i] ] = TRUE; 
 
 *ncandidatos = 0;
 
 for (i=1;i<=n;i++)
 if (in_perm[i] == FALSE) {
 c[ *ncandidatos] = i;
 
 *ncandidatos = *ncandidatos+1;
 }
}
 
processar_solucao(int a[], int k) {
 int i; /* Contador */
 
 for (i=1; i<=k; i++)
 printf(" %d", a[i]);
 
 printf("\n");
}
 
e_uma_solucao(int a[], int k, int n) {
 return (k == n);
}
Novamente, deve-se chamar a função backtrack da forma backtrack(a, 0, n).
Referências
1. ↑ Eitan Gurari (1999). CIS 680: Data Structures: Capítulo 19: Algoritmos de Backtracking
(http://www.cse.ohio-state.edu/~gurari/course/cis680/cis680Ch19.html#QQ1-51-128) (em inglês).
Obtida de "http://pt.wikipedia.org/w/index.php?title=Backtracking&oldid=32777293"
Categoria: Algoritmos de busca
Esta página foi modificada pela última vez à(s) 11h56min de 29 de outubro de 2012.
Este texto é disponibilizado nos termos da licença Atribuição-Partilha nos Mesmos Termos 3.0 não
Adaptada (CC BY-SA 3.0); pode estar sujeito a condições adicionais. Consulte as condições de uso
para mais detalhes.

Teste o Premium para desbloquear

Aproveite todos os benefícios por 3 dias sem pagar! 😉
Já tem cadastro?