2. Técnicas de Algoritmos
Técnicas de algoritmos apresentadas :
Algoritmos de Força Bruta
Algoritmos de Pesquisa Exaustiva
Algoritmos Dividir e Conquistar
Algoritmos Gulosos
Algoritmos de Backtracking (retrocesso)
2
3. Tópicos sobre Backtracking
Conhecer a técnica.
Apresentar a técnica através de objetos
ou dedução que são aplicáveis no
cotidiano.
Desenvolver e explicar um algoritmo
baseado em BACKTRACKING.
3
4. Conceito sobre a técnica de
Backtracking
Significado:
Volta de rastreamento.
É um algoritmo baseado em estrutura de dados, tem
como meta resolver o problema no menor intervalo de
tempo, não levando em consideração o esforço para
alcançar a solução.
Usa recursividade.
4
5. Características do Backtracking
Executa podas quando não é possível encontrar uma
solução pelo caminho escolhido.
Faz a busca em profundidade.
O número de escolhas cresce pelo menos
exponencialmente com o tamanho da instância.
Passos em direção à solução final são tentados e
registrados.
Algoritmos tentativa e erro.
5
9. Exemplo de Busca em Profundidade
LABIRINTO
Dado um labirinto, encontrar um caminho do início ao fim.
Em cada cruzamento, você tem que decidir entre três ou
menos escolhas:
Siga em frente
Vá para a esquerda
Vá para a direita
Cada escolha leva a um outro conjunto de opções.
Uma ou mais sequências de escolhas podem levar a uma
solução.
Vídeo demonstrativo
9
14. Problema das 4 Rainhas
Formulação do problema.
Restrições.
Modo de caminho.
BASTANTE ATENÇÃO
14
15. Demonstração
Linha por Linha
1 2 1 2 3
X X X X X
1 3 4
1 2 3 4 X X X
X X X X
1 2 3 4 1 2
X X X X 15
16. Algoritmo solução
Algoritmo que nos mostra as possíveis soluções
envolvendo um tabuleiro 8x8, consequentemente com 8
rainhas a serem distribuídas.
Clique para abrir o algoritmo
16
17. Problematização
Suponha que você tem que fazer uma série de
decisões, entre várias opções, onde você não
tem informações suficientes para saber o que
escolher e que cada decisão leva a um novo
conjunto de escolhas, sendo que alguma
sequência de escolhas (possivelmente mais de
uma) pode ser uma solução para seu problema, o
BACKTRACKING é uma maneira metódica de
experimentar várias sequências de decisões, até
encontrar uma que "funciona”.
17
18. Problematização
Abordagem mais comum é decompor o processo
em um número finito de tarefas parciais.
A construção de uma solução é obtida através de
tentativas (ou pesquisas) da árvore de sub-tarefas.
18
20. Exemplificando
A árvore é composta de nós
Notação:
Primeiro é o nó raiz
Nós internos
Nós folhas
Backtracking pode ser
pensado como a procura de
uma árvore para um nó
de “objetivo" de uma folha.
20
21. Exemplificando
Cada nó não-folha em uma árvore é um pai de um ou
mais outros nós (seus filhos)
Cada nó na árvore, diferente da raiz, tem exatamente um
dos pais
Nó pai
Nó pai
Nós filhos Nós filhos
21
22. Problema dos Filósofos
Tem-se 5 filósofos sentados ao redor de uma mesa.
Cada filósofo tem um prato e um garfo para comer.
A comida que será servida é um macarrão muito
escorregadio que deve ser comido com dois talheres.
Cada filósofo só pode comer o macarrão usando o seu
garfo e o garfo de um dos dois filósofos sentados ao seu
lado.
Dois filósofos não podem usar o mesmo garfo juntos.
Enquanto alguns filósofos comem os outros pensam,
aguardando a hora de comer.
22
24. Problema dos Filósofos - Algoritmo
int main ()
{
int j=0, prox=0;
printf ("Digite por qual filosofo começar: ");
scanf("%d", &fil);
printf ("Digite a quantidade de macarrão: ");
scanf("%d", &mac);
criafilosofo(mac,j);
filosofo (prato, fil, prox);
printf("%d",soma);
}
24
25. Problema dos Filósofos - Algoritmo
criafilosofo(mac,j)
{
if (j<5)
{
prato[j]=mac;
printf("Filosofo %d ",j);
printf(": %in",prato[j]);
j++;
criafilosofo(mac,j);
}
}
25
26. Problema dos Filósofos - Algoritmo
chamaproxfil(int proximo)
{
if (proximo==5)
proximo=0;
else
proximo=proximo++;
return proximo;
}
26
27. Problema dos Filósofos - Algoritmo
filosofo (int prato[], int i, int prox)
{
aux=chamaproxfil(prox);
soma=(prato[0]+prato[1]+prato[2]+prato[3]+prato[4]);
if ((i==aux)||((i+1)==aux)||((i-1)==aux)||((i==4)&&(aux==0))||
((i==0)&&(aux==4)))
{
filosofo(prato,i,aux);
}
27
37. Exercício Algoritmo
Suponha que você emitiu cheques em maio nos valores
de p(1), ..., p(n) ao longo do mês de setembro último.
No fim do mês, o banco informa que um total T foi
descontado de sua conta. Quais cheques foram
descontados? Por exemplo, se p = {61, 62, 63, 64} e T =
125 então só há duas possibilidades: ou foram
descontados os cheques 1 e 4 ou foram descontados os
cheques 2 e 3. esse é o “problema da soma de
subconjuntos ”. Desenvolva um algoritmo para resolver
este problema empregando a estratégia backtracking.
37