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 = {n 1, n 2, n 3, } f (n 1 ) f (n 2 ) f (n 3 ) 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., h dlr (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(r m ) mas uma boa heurística pode reduzi-lo dramaticamente Espaço? O(r m ) 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... A 8=0+8 B C 8=4+4 9=4+5 D E 8=8+0 9=6+3 9=5+4 7=7+0 G é objectivo óptimo mas D é o objectivo encontrado... F G
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: h dlr (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 G 2 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(g 2 ) = 0 porque G 2 é objectivo f(g 2 ) = g(g 2 ) + h(g 2 ) = g(g 2 ) > C* porque G 2 não é óptimo f(n) = g(n) + h(n) C* porque h é admissível Logo f(n) C* < f(g 2 ) e G 2 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 f i, com f i < f i+1
A* em grafo é óptima? Não, mesmo que a heurística seja admissível! Aqui fica um contra exemplo... A 7=0+7 5=4+1 B C 7=6+1 descartado! 8=7+1 objectivo óptimo C D 8=8+0 D 9=9+0 objectivo encontrado 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 l=f(a)=4 l=f(b)=f(c)=5 l=f(d)=8 A 4=0+4 A 4=0+4 A 4=0+4 B C B 5=3+2 C 5=2+3 B 5=3+2 C 5=3+2 5=2+3 5=2+3 D E 8=8+0 9=6+3 D 8=8+0 D E 8=8+0 9=6+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: h 1 (n) = número de peças mal colocadas h 2 (n) = soma da distância de Manhattan (i.e., nº de quadrados até à localização desejada para cada peça) h 1 (StartState) =? 8 h 2 (StartState) =? 3+1+2+2+2+3+3+2 = 18
Dominância Se h 2 (n) h 1 (n) para todos nós n (ambas admissíveis) então h 2 domina h 1 h 2 é 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 * (h 1 ) = 227 nós A * (h 2 ) = 73 nós prof=24 Profundidade Iterativa = muitos nós... A * (h 1 ) = 39,135 nós A * (h 2 ) = 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 h 1 (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 h 2 (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