procura informada - autenticação · nós na fila de folhas ordenados por ordem crescente da ......

60
Procura Informada Capítulo 4

Upload: ngodung

Post on 06-Dec-2018

218 views

Category:

Documents


0 download

TRANSCRIPT

Procura Informada

Capítulo 4

Livro

•  Capítulo 4 Secções 1 - 3

Resumo •  Estratégias de procura informadas

–  Gananciosa –  A* –  IDA* –  Melhor Primeiro Recursiva (RBFS)

•  Heurísticas •  Algorítmos de procura local

–  Hill-climbing –  Simulated annealing –  Local beam –  Genetic algorithms

Árvore de Procura •  Uma estratégia de procura determina a ordem

de expansão dos nós •  As procuras informadas usam conhecimento

específico do problema para determinar a ordem de expansão dos nós

•  Tipicamente este conhecimento é incorporado sob a forma de heurísticas (estimativas)

Procura Melhor Primeiro •  Ideia: usar uma função de avaliação f(n) para cada nó

–  f(n) usa conhecimento específico do problema –  O “melhor” nó é o que tem o menor valor de f(n)  Expandir primeiro o nó folha que tem o menor valor de f(n)

•  Implementação: Nós na fila de folhas ordenados por ordem crescente da função de avaliação –  Nós folha = {n1, n2, n3, …} f (n1) ≤ f (n2) ≤ f (n3) ≤ …

•  Casos especiais: –  Procura Gananciosa –  Procura A*

Roménia f(n) = distância linha recta (km)

Procura gananciosa

•  Função de avaliação f(n) = h(n) (heurística) •  = estimativa do custo do caminho desde n até

ao objectivo •  e.g., hdlr(n) = distância em linha recta desde n

até Bucareste •  Procura gananciosa expande o nó que parece

estar mais próximo do objectivo

Procura Gananciosa: exemplo

Nós folha = {Arad(366)}

Procura Gananciosa: exemplo

Nós folha = {Sibiu(253),Timisoara(329), Zerind(374)}

Procura Gananciosa: exemplo

Nós folha = {Fagaras(176), Rimnicu Vilcea(193), Timisoara(329), Arad(366), Zerind(374), Oradea(380)}

Procura Gananciosa: exemplo

Nós folha = {Bucharest(0), Rimnicu Vilcea(193), Sibiu(253), Timisoara(329), Arad(366), Zerind(374), Oradea(380)}

Procura gananciosa: propriedades

•  Completa? Não – pode entrar em ciclo exº, Iasi Fagaras = Iasi, Neamt, Iasi, …

•  Tempo? O(rm) mas uma boa heurística pode reduzi-lo dramaticamente

•  Espaço? O(rm) no pior caso mantém todos os nós em memória

•  Óptima? Não

•  Semelhante à procura em profundidade, mas mais exigente em memória (como a procura em largura)

Procura A* •  Ideia: evitar expandir caminhos que já têm um

custo muito elevado •  Função de avaliação f(n) = g(n) + h(n) •  g(n) = custo desde o nó inicial até n •  h(n) = estimativa do custo deste n até um estado

objectivo •  f(n) = estimativa do custo total da solução =

caminho desde estado inicial até estado objectivo (passando por n)

Procura A*: exemplo

Nós folha = {Arad(366)}

Procura A*: exemplo

Nós folha = {Sibiu(393), Timisoara(447), Zerind(449)}

Procura A*: exemplo

Nós folha = {Rimnicu Vilcea(413), Fagaras(415), Timisoara(447), Zerind(449), Arad(646),Oradea(671)}

Procura A*: exemplo

Nós folha = {Fagaras(415), Pitesti(417), Timisoara(447), Zerind(449), Craiova(526), Sibiu(553), Arad(646), Oradea(671)}

Procura A*: exemplo

Nós folha = {Pitesti(417), Bucharest(450), Timisoara(447), Zerind(449), Craiova(526), Sibiu(553), Sibiu(591), Arad(646), Oradea(671)}

Procura A*: exemplo

Nós folha = {Bucharest(418), Bucharest(450), Timisoara(447), Zerind(449), Craiova(526), Sibiu(553), Sibiu(591), Rimnicu Vilcea(607), Craiova(615), Arad(646), Oradea(671)}

A* é óptima? •  Não! Aqui fica um contra exemplo...

•  G é objectivo óptimo mas D é o objectivo encontrado...

A

C

E G F

B

8=0+8

8=4+4 9=4+5

8=8+0 9=6+3 9=5+4 7=7+0

D

Heurísticas admissíveis •  Uma heurística h(n) é admissível se para cada

nó n se verifica h(n) ≤ h*(n), onde h*(n) é o custo real do caminho desde n até ao objectivo.

•  Uma heurística admissível nunca sobrestima o custo de atingir o objectivo, i.e. é realista ou optimista

•  Exemplo: hdlr(n) (nunca sobrestima a distância real em estrada)

•  Teorema: se h(n) é admissível, então a procura em árvore A* é óptima

A* é Óptima (prova) •  Consideremos um nó objectivo não óptimo G2 que já foi

gerado mas não expandido (nó folha). Seja n um nó folha tal que n está no menor caminho para um nó objectivo óptimo G (com custo C*).

•  h(G2) = 0 porque G2 é objectivo •  f(G2) = g(G2) + h(G2) = g(G2) > C* porque G2 não é óptimo •  f(n) = g(n) + h(n) ≤ C* porque h é admissível •  Logo f(n) ≤ C* < f(G2) e G2 não será analisado antes de n e G

A* é Óptima •  A* expande os nós por ordem crescente do valor de f •  Gradualmente adiciona contornos/“curvas de nível" (à semelhança

dos mapas topográficos) que identificam conjuntos de nós •  Contorno i tem todos os nós com f ≤ fi, com fi < fi+1

A* em grafo é óptima? •  Não, mesmo que a heurística seja admissível!

Aqui fica um contra exemplo...

A

C D

B

7=0+7

5=4+1

8=8+0

8=7+1

7=6+1

9=9+0

D objectivo óptimo

objectivo encontrado

C

descartado!

C(8) é descartado por causa de C(7) e o objectivo encontrado (D(9)) não é óptimo...

A* e Procura em Grafo •  A* com procura em grafo não é óptima com heurísticas

admissíveis •  Pode ser descartado um nó que está no caminho que

leva à solução óptima pelo facto de o mesmo nó já ter sido explorado no passado

•  Pode passar a ser óptima se for mantido o registo dos caminhos e do valor de f(n) associados a todos os nós já explorados –  Um nó/caminho só é descartado se o valor de f(n) for maior do

que o valor registado •  Caso contrário… a heurística tem de ser consistente!

–  Teorema: se h(n) é consistente, então A* usando procura em grafo é óptima

Heurísticas Consistentes •  Garantem que se existirem dois caminhos para chegar

ao mesmo objectivo óptimo então o caminho de menor custo é sempre seguido em primeiro lugar

•  Uma heurística é consistente se para cada nó n, para cada sucessor n' de n gerado por uma acção a temos,

h(n) ≤ c(n,a,n') + h(n’) desigualdade triangular

um lado de um triângulo não pode ser maior que a soma dos outros dois lados

c(n,a,n') é o custo associado ao caminho de n a n‘ através de a

Heurísticas Consistentes •  Uma heurística é consistente se para cada nó n, para cada

sucessor n' de n gerado por uma acção a temos, h(n) ≤ c(n,a,n') + h(n') desigualdade triangular um lado de um triângulo não pode ser maior que a soma dos outros dois c(n,a,n') é o custo associado ao caminho de n a n‘ através de a

•  Se h é consistente, então temos f(n') = g(n') + h(n') = g(n) + c(n,a,n') + h(n') ≥ g(n) + h(n) ≥ f(n)

•  Logo, o valor de f(n) nunca decresce ao longo de um caminho

Propriedades de A*

•  Completa? Sim (excepto se o número de nós com f ≤ f(G) for infinito)

•  Tempo? Exponencial •  Espaço? Exponencial: mantém todos os nós em

memória (no pior caso) •  Óptima? Sim

A* Iterativa (IDA*)

•  IDA*: Iterative Deepening A* •  Versão iterativa em profundidade da procura A* •  Em cada iteração é incrementado o valor limite

para f(n); valor de f(n) superior ao limite n não é analisado

•  Em cada nova iteração o valor limite é actualizado com o menor valor de f(n) para os nós não explorados na iteração anterior

•  Não requer tanto espaço como A*

Implementação (I) Função IDA* (problema) devolve solução

estático: f-limite, limite actual para f raiz, um nó raiz ← CriaNó(EstadoInicial[problema]) f-limite ← f(raiz) loop solução, f-limite ← ProcProfContorno(raiz,f-limite) se solução não é nil então devolve solução se f-limite = ∞ então devolve falha

Implementação (II) Função ProcProfContorno (nó,f-limite) devolve solução,prox-f

estático: prox-f, próximo limite inicialmente ∞ se f(nó) > f-limite então devolve soluçãovazia, f(nó) se TesteObjectivo[problema](nó) então devolve solução,f-limite paracada nó s em sucessores(nó) solução,novo-f ← ProcProfContorno (s,f-limite) se solução não é nil então devolve solução,f-limite prox-f ← MIN(prox-f,novo-f) devolve nil,prox-f

IDA*: exemplo

A

C

E

B

4=0+4

8=8+0 8=8+0 9=6+3

D

A

C

E

B

4=0+4

8=8+0 9=6+3

D

A

l=f(A)=4

4=0+4

C B

5=3+2

l=f(B)=f(C)=5 l=f(D)=8

5=3+2 5=3+2

5=2+3 5=2+3

D

5=2+3

Melhor Primeiro Recursiva (RBFS)

•  Melhor primeiro (A*) com espaço linear (em p) •  Semelhante à procura em profundidade

(implementação recursiva) •  Para cada nó explorado, mantém registo do

caminho alternativo com menor valor de f •  Se o valor de f para o nó actual excede o valor

em memória, a recursão permite recuperar o melhor caminho alternativo

•  Uma alteração corresponde a uma iteração IDA* •  Óptima se h(n) é admissível

Melhor Primeiro Recursiva: exemplo

Melhor Primeiro Recursiva: exemplo

Melhor Primeiro Recursiva: exemplo

Heurísticas Admissíveis E.g., para o 8-puzzle: •  h1(n) = número de peças mal colocadas •  h2(n) = soma da distância de Manhattan (i.e., nº de quadrados até à

localização desejada para cada peça)

•  h1(StartState) = ? 8 •  h2(StartState) = ? 3+1+2+2+2+3+3+2 = 18

Dominância •  Se h2(n) ≥ h1(n) para todos nós n (ambas admissíveis) •  então h2 domina h1 •  h2 é melhor para a procura

–  Expande menos nós porque não é tão optimista / está mais próxima da realidade

•  Custo da procura (média do nº de nós expandidos):

prof=12 Profundidade Iterativa = 3,644,035 nós A*(h1) = 227 nós A*(h2) = 73 nós

prof=24 Profundidade Iterativa = muitos nós... A*(h1) = 39,135 nós A*(h2) = 1,641 nós

Heurísticas Admissíveis: como inventá-las?

•  Um problema com menos restrições é chamado problema relaxado

•  O custo de uma solução óptima para um problema relaxado pode ser usado como uma heurística admissível para o problema original

•  Exemplo do 8-puzzle: –  Se as regras do 8-puzzle são relaxadas tal que uma peça se

pode mover para qualquer posição, então h1(n) devolve a solução com o menor número de jogadas

–  Se as regras são relaxadas tal que cada peça se pode mover para qualquer posição adjacente, então h2(n) devolve a solução com o menor número de jogadas

Procura Local •  Em muitos problemas de optimização, o

caminho que leva ao objectivo é irrelevante; o próprio estado objectivo é a solução (e.g., n-rainhas)

•  Nestes casos, podemos usar procura local •  Mantém um único “estado actual”; caminhos não

são memorizados •  Em cada iteração procura “melhorar” o estado

actual; útil em optimização •  Tipicamente, um estado transita para estados

“vizinhos” •  PROBLEMA: não é completa!

Examplo: N-rainhas •  Problema: Colocar as N rainhas numa matriz n × n de

modo que nenhuma esteja em posição de atacar as outras

•  Estado inicial gerado aleatoriamente •  Novos estados gerados a partir de movimentos para

estados vizinhos

Hill-climbing (trepa colinas) ou procura local ganaciosa

•  É um simples ciclo que se move continuamente na direcção de um valor melhor. Termina quando nenhum sucessor tem valores melhores.

Hill-climbing

•  “É como subir o Evereste com nevoeiro cerrado e amnésia” (AIMA)

Hill-climbing

•  Problema: dependendo do estado inicial, pode ficar preso a um máximo local

Procura com o Hill-climbing no problema das 8 rainhas

•  h = nº de pares de rainhas que se estão a atacar –  No tabuleiro apresentado: h = 17 –  Num tabuleiro objectivo: h = 0

•  Inteiros correspondem ao valor de h para sucessores resultantes de mover rainha na respectiva coluna (≥12)

Procura com o Hill-climbing no problema das 8 rainhas

•  Função sucessor: mexer uma rainha para outra posição na mesma coluna.

•  Tipicamente, o Hill-clibing escolhe aleatoriamente entre os melhores sucessores, se houver mais do que um.

Procura com o Hill-climbing no problema das 8 rainhas

•  Mínimo local com h = 1 •  Qualquer sucessor tem valor de h superior

Não encontrou solução e não evoluiu para outro estado…

Hill Climbing

•  No caso das 8-rainhas – Começando num estado aleatório…

•  Só resolve 14% dos casos (necessita em média de 4 iterações)

•  Nos restantes casos fica “parado” ao fim de 3 iterações (em média)

Variantes do Hill Climbing •  Stochastic Hill climbing: escolhe aleatoriamente

de entre os melhores sucessores •  First-choice Hill Climbing: gera os sucessores

aleatoriamente até encontrar o primeiro com valores melhores que o estado actual e é esse que é escolhido (conveniente se um estado tiver milhares de possíveis sucessores)

•  Random-restart Hill Climbing: conduz uma séria de procuras a partir de diferentes estados iniciais, gerados aleatoriamente; pára quando se encontra o objectivo

Hill Climbing

•  Apesar de tudo: – Converge (ou não) rapidamente – Por exemplo, o Random-restart Hill Climbing

consegue encontrar uma solução para as n-rainhas, em menos de um minuto, mesmo para 3 milhões de rainhas.

Procura Simulated Annealing •  Ideia: escapar ao mínimos locais permitindo que

se façam movimentos “maus”, mas vai gradualmente decrementando a sua frequência –  Em vez de escolher o melhor sucessor, escolhe um

sucessor aleatoriamente que tipicamente é “aceite” se melhorar a situação

–  Em Português: têmpera simulada

•  Consegue-se provar que se temperatura T diminuir suficientemente devagar (em função do schedule), então a procura simulated annealing vai encontrar um máximo global com probabilidade próxima do 1

Simulated Annealing

•  Metáfora: imaginar a tarefa de pôr uma bola de ping-pong no buraco mais profundo de uma superfície cheia de buracos

•  Uma solução é deixar a bola ir parar a um mínimo local e depois abanar a superfície de modo a tirá-la do mínimo local

•  Simulated annealing começa por “abanar” muito no início e depois vai abanando cada vez menos

Simulated Annealing

Local Beam (procura em banda)

•  Guarda a referência a k estados, em vez de 1 –  Começa com k estados gerados aleatoriamente

•  Em cada iteração, todos os sucessores dos k estados são gerados

•  Se algum é um estado objectivo, pára; caso contrário escolhe os k melhores sucessores e repete

Procura Local Beam •  Atenção que este algoritmo é mais do que correr

k Random-restart Hill Climbings em paralelo!! –  Não têm de ser escolhidos sucessores de todos os

estados –  Se um estado gera vários bons sucessores e os

outros k-1 estados não, os estados menos promissores são abandonados

•  No entanto, também pode ter problemas: pode haver pouca diversidade nos k estados… –  Stochastic Beam Search: k sucessores são

escolhidos aleatoriamente

Algoritmos Genéticos •  Variante da stochastic beam search

•  Começa com k estados gerados aleatoriamente (população) tal como procura em banda –  Um estado é representados como uma string sobre

um alfabeto finito (geralmente {0,1}) •  O estado sucessor é gerado através da

combinação de dois estados (pais) –  Produz a próxima geração de estados por selecção,

cruzamento e mutação –  A função de avaliação (fitness function) dá valores

mais altos aos melhores estados

Algoritmos Genéticos

•  Fitness function (b): nº de pares de rainhas não atacantes (min = 0, max = (8 × 7)/2 = 28) –  Probabilidade de selecção (c) em função da fitness

function •  Exº 24/(24+23+20+11) = 31%

Algoritmos Genéticos

•  O ponto de cruzamento é escolhido aleatoriamente •  São criados os filhos (d) •  Cada estado sofre mutações aleatórias (e)

Algoritmos Genéticos: exº cruzamento e mutação

32752411 24748552 32748552 32748152

Algoritmos Genéticos •  Há ainda muito trabalho a fazer de modo a perceber em que condições e com que parâmetros é que os algoritmos genéticos se comportam bem