Pesquisa informada Best-first search o Dispomos de informação especifica sobre o problema. o Esta informação pode ser disponibilizada por uma função de avaliação que indica o quão desejável é expandir um determinado nó. o Se os nós estiverem ordenados por forma a que aquele que tiver a melhor avaliação é expandido primeiro, estamos perante a estratégia best-first search. o Algoritmo : © Noel de Jesus Mendonça Lopes Function BestFirstSearch(problema, FuncaoAvaliacao ) returns solução ou falha FuncaoAdicaoFila ← Função que ordena os nós da fila de acordo com FuncaoAvaliacao return PesquisaGeral (problema, FuncaoAdicaoFila ) 1 2 Best-first search – Pesquisa gananciosa (greedy) Best-first search o A qualidade desta estratégia de pesquisa depende da qualidade da função de avaliação. o Os algoritmos pertencentes a esta família tentam encontrar soluções de baixo custo. Tipicamente utilizam estimativas do custo do estado actual até à solução mais próxima e tentam minimizar o seu valor. © Noel de Jesus Mendonça Lopes © Noel de Jesus Mendonça Lopes o Os nós cujo estado se julga estar mais próximo do objectivo são expandidos primeiro. o Uma função que calcula uma estimativa do custo é chamada por função heurística e é usualmente designada por h. h(n) = Custo estimado do caminho mais barato desde o estado correspondente ao nó n até a um estado objectivo 3 © Noel de Jesus Mendonça Lopes 4 1 Distância em linha recta até Bucharest Pesquisa gananciosa Arad Bucharest Craiova Dobreta Eforie Fagaras Giurgiu Hirsova Lasi Lugoj Mehaida Neamt Oradea itesti Rimnicu Vilcea Sibiu Timisoara Urziceni Vaslui Zerind o h(n) deve ser zero quando o nó n tenha associado um estado correspondente ao objectivo. o Algoritmo : Function GreedySearch(problema, FuncaoAvaliacao) returns solução ou falha return BestFirstSearch(problema, h) o Tenta atingir o objectivo o mais depressa possível. o Encontra soluções rapidamente. © Noel de Jesus Mendonça Lopes Oradea Neamt 87 71 151 Zerind Iasi 92 75 140 Sibiu 99 Vaslui Arad Fagaras 118 Timisoara 142 80 Rimnicu Vilcea 211 Lugoj 111 98 Hirsova 97 101 70 85 146 Mehadia Pitesti Urziceni 86 75 Bucharest 138 Dobreta 90 120 Eforie Criova Giurgiu h(n) = distância em linha recta entre n e a localização do objectivo 5 Pesquisa gananciosa A* o Susceptível a falsas partidas f(n) = g(n) + h(n) n Ex : Ir de Lasi para Fagaras n Necessário evitar estados repetidos n São expandidos nós desnecessários o Não é óptimo nem completo, à semelhança do deep-first search. o Complexidade : O(b m). No entanto a complexidade pode ser reduzida substancialmente dependendo da qualidade de h. © Noel de Jesus Mendonça Lopes 366 0 160 242 161 178 77 151 226 244 241 234 380 98 193 253 329 80 199 374 7 f(n) = custo estimado da solução mais “barata” que passa por n Function A*(problema) returns solução ou falha return BestFirstSearch (problema, g + h) © Noel de Jesus Mendonça Lopes 8 2 A* Heurísticas admissíveis o Óptimo e completo se : o São por natureza optimistas. o Em quase todas as heurísticas admissíveis o custo de f nunca decresce ao longo de qualquer caminho a partir da raiz da árvore de pesquisa. Estas heurísticas têm um comportamento monótono. n h(n) nunca sobrestimar o custo de alcançar o objectivo. Uma função h que obedeça a este critério é designada por heurística admissível. © Noel de Jesus Mendonça Lopes 9 © Noel de Jesus Mendonça Lopes Heurísticas admissíveis Oradea Neamt Zerind o Quando a heurística não é monótona podemos fazer uma pequena correcção em f que a torne monótona. Supondo que o nó n é o pai de n’, podemos transformar f numa função monótona da seguinte forma : f(n’) = max( f(n), g(n’) + h(n’) ) o Esta equação designa-se por equação do caminho máximo. © Noel de Jesus Mendonça Lopes 10 Iasi Sibiu Arad Vaslui Fagaras 380 Timisoara 400 Rimnicu Vilcea Lugoj Hirsova 420 Mehadia Pitesti Urziceni Bucharest Dobreta Eforie Criova Giurgiu 11 3 Contornos A* o Se h for 0 (uniform-cost search), os limites dos contornos serão circulares, à volta do estado inicial. o Quanto melhor for a heurística mais os limites dos contornos se esticarão em direcção do objectivo. o É eficientemente óptimo para qualquer função heurística. © Noel de Jesus Mendonça Lopes n Não existe nenhum outro algoritmo óptimo que expanda menos nós que o A* o É completo desde que o custo de todas as operações seja positivo (maior que zero). 13 Funções heurísticas 5 4 1 6 1 8 8 7 3 2 7 2 6 14 Funções heurísticas 3 5 4 4 6 1 5 7 3 © Noel de Jesus Mendonça Lopes © Noel de Jesus Mendonça Lopes o Factor de ramificação ≈ 3 o Solução ≈ 20 passos o Pesquisa exaustiva : 32 0 = 35 x 108 estados o Evitando os estados repetidos : 9! = 362880 8 2 15 © Noel de Jesus Mendonça Lopes 16 4 Funções heurísticas Funções heurísticas o Determinar uma função heurística que nunca sobrestime o número de passos necessários para atingir o objectivo? o h1 = nº de peças fora da posição correcta. o h2 = soma das distâncias de cada uma das peças até à sua posição correcta (segundo a distância de manhattan). © Noel de Jesus Mendonça Lopes 17 Factor de ramificação efectivo (b*) © Noel de Jesus Mendonça Lopes Factor de ramificação efectivo Custo da pesquisa N = 1 + b* + (b*)2 + ... + 18 (b*)d Uma boa heurística terá um b* perto de 1 Factor de ramificação efectivo d IDS A*(h1 ) A*(h2 ) IDS A*(h1 ) A*(h2 ) 2 10 6 6 2.45 1.79 1.79 4 112 13 12 2.87 1.48 1.45 6 680 20 18 2.73 1.34 1.30 8 6384 39 25 2.80 1.33 1.24 IDS – Iterative deepening search. Dados obtidos em 100 instâncias de um puzzle com 8 peças. © Noel de Jesus Mendonça Lopes 19 © Noel de Jesus Mendonça Lopes 20 5 Factor de ramificação efectivo Custo da pesquisa d IDS A*(h1 ) Heurísticas o h2 domina h1 , se quando utilizamos h2 expandimos em média menos nós que quando utilizamos h1 . o Entre duas heurísticas é sempre preferível aquela com maiores valores, desde que não sobrestime o custo de atingir o objectivo. Factor de ramificação efectivo A*(h2 ) IDS A*(h1 ) A*(h2 ) 10 47127 93 39 2.79 1.38 1.22 12 364404 227 73 2.78 1.42 1.24 14 3473941 2.83 539 113 1.44 1.23 16 1301 211 1.45 1.25 18 3056 363 1.46 1.26 20 7276 676 1.47 1.27 22 18094 1219 1.48 1.28 24 39135 1641 1.48 1.26 © Noel de Jesus Mendonça Lopes 21 © Noel de Jesus Mendonça Lopes 22 5 4 6 1 8 7 3 2 Problemas relaxados Problemas relaxados o Um problema com menos restrições nos operadores diz-se relaxado. o Muitas vezes o custo de uma solução exacta para um problema relaxado é uma boa heurística para o problema original. o Uma peça pode mover-se de A para B se A é adjacente a B e B está vazio. o Uma peça pode mover-se de A para B se A é adjacente a B. o Uma peça pode mover-se de A para B se B está vazio. o Uma peça pode mover-se de A para B. © Noel de Jesus Mendonça Lopes 23 © Noel de Jesus Mendonça Lopes 24 6 Problemas relaxados Escolha das heurísticas o Em (1993) um programa chamado ABSOLVER cujo objectivo é gerar heurísticas de forma automática a partir da definição de um problema, encontrou a primeira heurística útil para o cubo de Rubik e gerou uma nova heurística para o puzzle com 8 peças, que resultou ser melhor que qualquer das heurísticas existentes. o O ABSOLVER utiliza o método do “problema relaxado” em conjunto com outras técnicas. o Se dispusermos de várias heurísticas admissíveis h 1, h 2, ..., h m e nenhuma dominar as restantes qual escolher ? © Noel de Jesus Mendonça Lopes 25 h(n) = max(h 1(n), h 2(n), ..., hm(n)) o Desta forma é utilizada a heurística mais precisa para o nó em questão. o Como todas as heurísticas que compõem h são admissíveis h é também admissível. o Obviamente h domina todas as heurísticas que a compõem. © Noel de Jesus Mendonça Lopes Escolha das heurísticas Escolha das heurísticas o Uma boa função heurística para além de ser precisa deve ser ainda eficiente. o Estatística o Recolha das características do estado que contribuem para a avaliação heurística. o Usualmente a função de avaliação é uma combinação linear dos valores das características. o Mas qual a contribuição de cada característica ? n Perdemos a garantia de admissibilidade mas em média expandimos menos nós n Ex : Quando h(n) = 14 em 90% dos casos são necessários 18 passos. © Noel de Jesus Mendonça Lopes 27 © Noel de Jesus Mendonça Lopes 26 28 7 Contribuição das características para a função de avaliação Heurísticas para problemas de satisfação de restrições (CSP) o Mesmo quando não se sabe o quão importante é uma característica, ou se é benéfica ou má é possível a um algoritmo de aprendizagem adquirir coeficientes razoáveis para cada característica. o Heurística da variável mais restringida © Noel de Jesus Mendonça Lopes n Usada em conjunto com o forward checking; n Escolhemos a variável que dispõe de menos valores; n O factor de ramificação tende a ser menor. 29 Heurísticas para problemas de satisfação de restrições (CSP) 30 Iterative deepening A* (IDA*) o Heurística da variável mais restritiva n Escolhe a variável que aparece no maior número de restrições que contêm variáveis sem valor; n O factor de ramificação tende a ser menor. o Heurística do valor menos restritivo n Escolhe o valor que retira o menor número de valores das variáveis que partilham restrições com a variável actual. © Noel de Jesus Mendonça Lopes © Noel de Jesus Mendonça Lopes 31 o Cada iteração é feita com um algoritmo similar ao deep-limited search, mas em vez de se parar a pesquisa quando uma determinada profundidade é alcançada esta para quando o custo de f(n) for superior a um determinado valor. o Em cada iteração são expandidos os nós dentro do contorno para o custo de f actual e determina-se qual será o próximo contorno. © Noel de Jesus Mendonça Lopes 32 8 Iterative deepening A* (IDA*) Iterative deepening A* (IDA*) function Contorno(p, no, limitef) returns solução e um novo limite do custo de f inputs : p, problema no, um nó limitef, o limite actual do custo de f (contorno) local variables : proximof, o próximo limite do custo de f (contorno), inicialmente ∞ function IDA (p) returns solução ou falha inputs : p, problema local variables : limitef, o limite do custo de f (contorno) raiz, um nó raiz ← CriaNo(EstadoInicial(p)) limitef ← Custo(raiz) if Custo(no) > limitef then return null, Custo(no) if Objectivo(p, Estado(no)) then return no, limitef for each nó s in Sucessores(no) do solução, novof ← Contorno(p, s, limitef) if solução is null then if novof < proximof then proximof ← novof else return solução, limitef end next return null, proximof do solução, limitef ← Contorno(p, raiz, limitef) if solução is null then if limitef = ∞ then return falha else return solução end loop © Noel de Jesus Mendonça Lopes 33 © Noel de Jesus Mendonça Lopes Iterative deepening A* (IDA*) Algoritmo ε-admissível o Completo e óptimo, tendo em atenção as mesmas salvaguardas que o A*. o Necessita de muito menos memória que o A*. o A complexidade (tempo) depende do número de valores diferentes que a heurística pode devolver o Em cada iteração aumentamos o valor do contorno por ε. n Ex: No puzzle com 8 peças f cresce apenas uma ou duas vezes, já no problema do caixeiro viajante o valor de f é em principio diferente para cada nó, o que significa que cada contorno pode incluir apenas mais um nó. © Noel de Jesus Mendonça Lopes 35 34 n Reduzimos assim o custo da pesquisa, já que em cada itera ção são englobados mais nós (dependendo de ε). n A solução retornada pode ser pior do que a óptima, no máximo por ε. © Noel de Jesus Mendonça Lopes 36 9 Simplified Memory-Bounded A* (SMA*) o Utiliza toda a memória que lhe for disponibilizada. o Evita estados repetidos sempre que a memória o permita. o É completo desde que a memória disponível seja suficiente para guardar o caminho para a solução com o menor profundidade. © Noel de Jesus Mendonça Lopes 37 Simplified Memory-Bounded A* o Antes de gerar um sucessor o algoritmo verifica se existe memória suficiente para o guardar. Caso não exista memória suficiente o algoritmo retira um dos nós da fila para poder gerar o sucessor. o Os nós retirados da fila são aqueles menos promissores, isto é aqueles com maior custo de f e são chamados nós esquecidos. © Noel de Jesus Mendonça Lopes 39 Simplified Memory-Bounded A* o É óptimo desde que a memória disponível seja suficiente para guardar o caminho para a solução com o menor custo. Caso contrário retorna a melhor solução que se pode atingir com a memória disponível. o Quando existe memória suficiente para guardar a árvore de pesquisa completa o algoritmo é eficientemente óptimo. © Noel de Jesus Mendonça Lopes 38 Simplified Memory-Bounded A* o De forma a evitar re -explorar sub -árvores retiradas da memória em cada nó antecessor é guardada informação do melhor caminho na subárvore esquecida. Desta forma o algoritmo só regenera uma sub -árvore , quando todos os outros caminhos parecerem piores que o caminho esquecido. o Desta forma se todos os descendentes do nó n forem esquecidos, não saberemos por onde devemos ir a partir do nó n mas sabemos se vale a pena ir pelo nó n. © Noel de Jesus Mendonça Lopes 40 10 Simplified Memory-Bounded A* function SMA(p) returns solução ou falha /*dada a complexidade do algoritmo muitos pormenores foram omitidos */ inputs : p, problema local variables : fila, uma fila de nós ordenada primeiro pelo custo f dos nós e depois por ordem decrescente pela profundidade dos nós fila ← CriaFila(CriaNo (EstadoInicial(p)) Simplified Memory-Bounded A* function CustoF(p, n) returns custo de f para o nó n inputs : p, problema n, nó static : maiorProfundidade, O maior número de nós que conseguimos ter em memória. do if Vazia(fila) then return falha n ← primeiro nó da fila if Objectivo(p, Estado(n)) then return n if not TemMaisSucessores(n) then Actualiza o custo f do nó n e dos seus antecessores else s ← ProximoSucessor(n) f(s) ← CustoF(p, s) if Cheia(fila) then RetiraUltimoNo (fila) Insere(fila, s) end if not Objectivo(p, Estado(n)) and Profundidade(n) = maiorProfundidade then return ∞ if Pai(n) is null then return g(n) + h(n) return Max(f(Pai(n)), g(n) + h(n)) loop © Noel de Jesus Mendonça Lopes 41 © Noel de Jesus Mendonça Lopes 42 A 0+12=12 10 Hill-climbing 8 B G 10+5=15 8+5=13 10 10 C 20+5=25 10 E 8 D 20+0=20 10 I 16+2=18 8 J F 30+5=35 16 H 30+0=30 24+0=24 8 K 24+0=24 24+5=29 © Noel de Jesus Mendonça Lopes 44 11 Hill-Climbing function HillClimbing(p) returns solução inputs : p, problema local variables : actual, um nó proximo, um nó actual ← CriaNo(EstadoInicial(p)) do proximo ← O sucessor de actual com maior valor if valor(proximo) < valor(actual) then return actual actual ← proximo loop © Noel de Jesus Mendonça Lopes 45 12