Backtracking

40
Backtracking

description

Técnica de complexidade de algoritmo BACKTRACKING, bem ilustrada e resumida.

Transcript of Backtracking

Page 1: Backtracking

Backtracking

Page 2: Backtracking

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

Page 3: Backtracking

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

Page 4: Backtracking

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

Page 5: 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

Características do Backtracking

Page 6: Backtracking

Animação Árvore de Backtracking

6

Page 7: Backtracking

Backtracking (animação)

7

?

?Sem saída

Sem saída

??

Sem saída

Sem saída

?

Êxito!

Sem saída

Começo

Page 8: Backtracking

Exemplo de Busca em Profundidade

8

LABIRINTO

Page 9: Backtracking

Exemplo de Busca em Profundidade

9

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

Page 10: Backtracking

Aplicações cotidianas

10

Page 11: Backtracking

Busca Exaustiva VS Backtracking

GPS ( global position system )

11

Page 12: Backtracking

Resolver um enigma – resta 1

Modo de preenchimento.

Modo de remoção.

Objetivo.

Dificuldade.

12

Page 13: Backtracking

Problema das N rainhas

13

Page 14: Backtracking

Problema das 4 Rainhas

Formulação do problema.

Restrições.

Modo de caminho.

14

BASTANTE ATENÇÃO

Page 15: Backtracking

15

1X

2X

1X

2X

3X

4X

1X

3X

4X

1X

2X

3X

4X

1X

2X

3X

1X

2X

Linha por LinhaDemonstração

COMPLETO

Page 16: Backtracking

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

Page 17: Backtracking

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

Page 18: Backtracking

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

Page 19: Backtracking

Simulação no Google Maps

19

Page 20: Backtracking

Exemplificando

20

Notação:

A árvore é composta de nós

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.

Page 21: Backtracking

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

21

Nó pai

Nós filhos

Nó pai

Nós filhos

Page 22: Backtracking

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

Page 23: Backtracking

Problema dos Filósofos

23

Page 24: Backtracking

Problema dos Filósofos - Algoritmoint 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

Page 25: Backtracking

Problema dos Filósofos - Algoritmocriafilosofo(mac,j)

{

if (j<5)

{

prato[j]=mac;

printf("Filosofo %d ",j);

printf(": %i\n",prato[j]);

j++;

criafilosofo(mac,j);

}

}

25

Page 26: Backtracking

Problema dos Filósofos - Algoritmochamaproxfil(int proximo)

{

if (proximo==5)

proximo=0;

else

proximo=proximo++;

return proximo;

}

26

Page 27: Backtracking

Problema dos Filósofos - Algoritmofilosofo (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

Page 28: Backtracking

Problema dos Filósofos - Algoritmoelse if(soma==0)

{

printf("Filosofo 1: %d\n", prato[0]);

printf("Filosofo 2: %d\n", prato[1]);

printf("Filosofo 3: %d\n", prato[2]);

printf("Filosofo 4: %d\n", prato[3]);

printf("Filosofo 5: %d\n", prato[4]);

printf("\n");

}

28

Page 29: Backtracking

Problema dos Filósofos - Algoritmoelse if (soma==1)

{

for(k=0;k<=4;k++)

{

if (prato[k]==1)

{

prato[k]=(prato[k]-1);

filosofo(prato,i,aux);

}

}

}

29

Page 30: Backtracking

Problema dos Filósofos - Algoritmoelse if((prato[aux]==0) ||(prato[i]==0))

{

filosofo(prato,i,aux);

} else

{

prato[i]=prato[i]-1;

prato[aux]=prato[aux]-1;

i=i+1;

if(i==5)

i=0;

30

Page 31: Backtracking

Problema dos Filósofos - Algoritmo printf("Filosofo 1: %d\n", prato[0]);

printf("Filosofo 2: %d\n", prato[1]);

printf("Filosofo 3: %d\n", prato[2]);

printf("Filosofo 4: %d\n", prato[3]);

printf("Filosofo 5: %d\n", prato[4]);

printf("\n");

filosofo(prato, i, aux);//chamada recursiva à função filosofo

}

}

31

Page 32: Backtracking

Problema dos Filósofos - Algoritmo

Conhecer o algoritmo implementado.

Clique aqui para abrir

32

Page 33: Backtracking

Começando a interação

33

Page 34: Backtracking

Mãos a obra

Acessem de qualquer máquina o link abaixo

Avaliativo

http://goo.gl/CFauR

34

Page 35: Backtracking

Mãos a obra

No site procurem a aba AVALIAÇÃO

E clique no link para começar a avaliação

( feito individualmente )

35

Page 36: Backtracking

Implementando

De acordo com as explicações implemente o algoritmo do

“Problema da Soma dos Conjuntos”.

36

Page 37: Backtracking

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

Page 38: Backtracking

Finalizando

38

Page 39: Backtracking

Considerações finais

39

Page 40: Backtracking

40

Obrigado pela atenção!!

Danilo Fraga CostaReginaldo Faria da SilvaDouglas Vinícius Souza da MataSaymon Cristian Alves Oliveira