• Nenhum resultado encontrado

aula 04 - Funções heurísticas

N/A
N/A
Protected

Academic year: 2021

Share "aula 04 - Funções heurísticas"

Copied!
7
0
0

Texto

(1)

Funções Heurísticas

O quebra-cabeça de 8 peças foi um dos primeiros problemas de busca heurística. O objetivo do quebra-cabeça é deslizar as peças horizontalmente ou verticalmente no espaço vazio até que a configuração corresponda à configuração da meta, como na figura abaixo.

O custo médio da solução para uma instância de 8 peças, gerada aleatoriamente, é de cerca de 22 etapas. O fator de ramificação é de cerca de 3, quando o bloco vazio está no meio, quatro movimentos são possíveis; quando está em um canto, dois; e quando está ao longo de uma borda, três. Isso significa que uma pesquisa de árvore exaustiva em profundidade d = 22 olharia aproximadamente 322 ≈ 3.1 × 1010 estados.

Uma pesquisa por grafo reduziria isso por um fator de cerca de 170.000, porque apenas 9!/2 = 181.440 estados distintos são alcançáveis. Este é um número gerenciável, mas o número correspondente para o quebra-cabeças de 15 peças é de aproximadamente 1013, então a próxima

ordem é encontrar uma boa função heurística.

Se quisermos encontrar as soluções mais curtas usando A*, precisamos de uma função heurística que nunca superestime o número de etapas para a meta. Há uma longa história de tais heurísticas para o quebra-cabeça de 15; aqui estão dois candidatos comumente usados:

• h1 = o número de peças mal posicionadas. Para a figura abaixo, todas as oito peças estão fora de

posição, então o estado inicial teria h1 = 8. h1 é uma heurística admissível porque é claro que

(2)

• h2 = a soma das distâncias das peças das suas posições de objetivo. Como as peças não podem se

mover ao longo das diagonais, a distância que contaremos é a soma das distâncias horizontal e vertical. Isso às vezes é chamado de distância do quarteirão ou distância de Manhattan. h2 também

é admissível, porque tudo o que qualquer movimento pode fazer é mover um bloco um passo mais perto do objetivo. As peças 1 a 8 no estado inicial dão uma distância Manhattan de h2 = 3 + 1 + 2 +

2 + 2 + 3 + 3 + 2 = 18. Como esperado, nenhum destes superestima o verdadeiro custo da solução, que é 26.

O efeito da precisão heurística no desempenho

Uma maneira de caracterizar a qualidade de uma heurística é o fator efetivo de ramificação b∗. Se o número total de nós gerados por A* para um problema específico for N e a profundidade da solução for d, então b* é o fator de ramificação que uma árvore uniforme de profundidade d teria para conter nós N + 1. Assim:

N + 1 = 1 + b* + (b*)2 + ··· + (b*)d

Por exemplo, se A* encontrar uma solução na profundidade 5 usando 52 nós, o fator efetivo de ramificação será 1,92. O fator efetivo de ramificação pode variar entre instâncias de problemas, mas geralmente é bastante constante para problemas suficientemente difíceis. A existência de um fator de ramificação efetivo segue do resultado, mencionado anteriormente, que o número de nós expandidos por A* cresce exponencialmente com a profundidade da solução.

Portanto, medições experimentais de b* em um pequeno conjunto de problemas podem fornecer um bom guia à utilidade geral da heurística. Uma heurística bem projetada teria um valor de b* próximo de 1, permitindo que problemas razoavelmente grandes fossem resolvidos a um custo computacional razoável.

Para testar as funções heurísticas h1 e h2, geramos 1200 problemas aleatórios com comprimentos de

solução de 2 a 24 (100 para cada número par) e os resolvemos com busca de aprofundamento iterativo e com pesquisa de árvore A* usando h1 e h2. A tabela abaixo mostra o número médio de

nós gerados por cada estratégia e o fator efetivo de ramificação. Os resultados sugerem que h2 é

melhor que h1 e é muito melhor do que usar pesquisa de aprofundamento iterativo. Mesmo para

pequenos problemas com d = 12, A* com h2 é 50.000 vezes mais eficiente que a pesquisa de

(3)

Pode-se perguntar se h2 é sempre melhor que h1. A resposta é “Essencialmente, sim”. É fácil ver

pelas definições das duas heurísticas que, para qualquer nó n, h2(n) ≥ h1(n). Assim, dizemos que h2

domina h1. A dominação se traduz diretamente em eficiência: A* usando h2 nunca expandirá mais

nós do que A* usando h1 (exceto possivelmente para alguns nós com f(n) = C*).

O argumento é simples. Lembre-se da observação de que todo nó com f(n) < C* certamente será expandido. Isto é o mesmo que dizer que todo nó com h(n) < C − g (n) certamente será expandido. Mas como h2 é, pelo menos, tão grande quanto h1 para todos os nós, cada nó que é certamente

expandido por A* search com h2 também será certamente expandido com h1, e h1 pode fazer com

que outros nós também sejam expandidos. Portanto, geralmente é melhor usar uma função heurística com valores mais altos, desde que seja consistente e que o tempo de computação para a heurística não seja muito longo.

Gerando heurísticas admissíveis a partir de problemas relaxados

Vimos que h1 (peças mal posicionadas) e h2 (distância Manhattan) são boas heurísticas para o

quebra-cabeça de 8 peças e h2 é melhor. Como h2 foi pensado? É possível que um computador

invente tal heurística mecanicamente? h1 e h2 são estimativas do comprimento do caminho

remanescente para o quebra-cabeça de 8, mas também são comprimentos de caminho perfeitamente precisos para versões simplificadas do quebra-cabeça.

Se as regras do quebra-cabeça foram alterados de modo que um bloco pudesse se mover para qualquer lugar em vez de apenas para o quadrado vazio adjacente, então h1 daria o número exato de

etapas na solução mais curta. Da mesma forma, se um bloco pudesse mover um quadrado em qualquer direção, mesmo em um quadrado ocupado, então h2 daria o número exato de etapas na

(4)

solução mais curta. Um problema com menos restrições nas ações é chamado de problema relaxado. O gráfico de espaço de estados do problema relaxado é um supergráfico do espaço de estados original, porque a remoção de restrições cria bordas adicionais no gráfico.

Como o problema relaxado adiciona bordas ao espaço de estados, qualquer solução ótima no problema original é, por definição, também uma solução no problema relaxado; mas o problema relaxado pode ter melhores soluções se as bordas adicionadas fornecerem atalhos. Assim, o custo de uma solução ótima para um problema relaxado é uma heurística admissível para o problema original. Além disso, como a heurística derivada é um custo exato para o problema relaxado, ela deve obedecer à desigualdade do triângulo e, portanto, é consistente.

Se uma definição de problema é escrita em uma linguagem formal, é possível construir automaticamente problemas relaxados. Por exemplo, se as ações do quebra-cabeças de 8 forem descritas como:

Um bloco pode mover-se do quadrado A para o quadrado B se A é horizontal ou verticalmente adjacente a B, e B está em branco.

podemos gerar três problemas relaxados removendo uma ou ambas as condições: (a) Uma peça pode mover-se do quadrado A para o quadrado B, se A for adjacente a B. (b) Uma peça pode se mover do quadrado A para o quadrado B, se B estiver em branco. (c) Uma peça pode mover-se do quadrado A para o quadrado B.

De (a), podemos derivar h2 (distância de Manhattan). O raciocínio é que h2 seria a pontuação

adequada se movêssemos cada bloco de volta para o seu destino. A partir de (c), podemos derivar h1

(peças fora de lugar), porque seria a pontuação adequada se as peças pudessem se mover para o destino pretendido em uma etapa. Note que é crucial que os problemas relaxados gerados por esta técnica possam ser resolvidos essencialmente sem busca, porque as regras relaxadas permitem que o problema seja decomposto em oito subproblemas independentes. Se o problema relaxado é difícil de resolver, então os valores da heurística correspondente serão caros de se obter.

Um programa chamado ABSOLVER, criado em 1993, pode gerar heurísticas automaticamente a partir de definições de problemas, usando o método do “problema relaxado” e várias outras técnicas. Ele gerou uma nova heurística para o quebra-cabeça de 8 que foi melhor que qualquer heurística preexistente, e encontrou a primeira heurística útil para o famoso Cubo de Rubik.

(5)

Um problema com a geração de novas funções heurísticas é que muitas vezes falha-se em obter uma única heurística “claramente melhor”. Se uma coleção de heurísticas admissíveis h1 ... hm está

disponível para um problema e nenhum deles domina nenhum dos outros, o qual devemos escolher? Como se constata, não precisamos fazer uma escolha. Podemos ter o melhor de todos os mundos, definindo

h(n) = max{h1(n), ... ,hm(n)}.

Essa heurística composta usa a função mais precisa no nó em questão. Porque o componente heurística é admissível, h é admissível; Também é fácil provar que h é consistente. Além disso, h domina todas as suas heurísticas componentes.

Gerando heurísticas admissíveis de subproblemas: bancos de dados de padrão

A heurística admissível também pode ser derivada do custo da solução de um subproblema de um determinado problema. Por exemplo, a figura abaixo mostra um subproblema da instância ilustrada na segunda figura da primeira página. O subproblema envolve colocar as peças 1, 2, 3, 4 em suas posições corretas. Claramente, o custo da solução ótima deste subproblema é um limite inferior no custo do problema completo.

Acaba sendo mais preciso que a distância de Manhattan em alguns casos. A ideia por trás dos bancos de dados padrão é armazenar esses custos exatos de solução para cada instância de subproblema possível - em nosso exemplo, todas as configurações possíveis dos quatro blocos e do espaço em branco. As localizações das outras quatro peças são irrelevantes para os propósitos de resolver o subproblema, mas as jogadas dessas peças contam para o custo. Então nós computamos uma heurística admissível hDB para cada estado completo encontrado durante a busca simplesmente

olhando para cima a configuração de subproblema correspondente no banco de dados.

O banco de dados em si é construído pesquisando a partir da meta e registrando o custo de cada novo padrão encontrado; a despesa dessa pesquisa é amortizada em muitas instâncias de problemas subseqüentes.

A escolha do 1-2-3-4 é bastante arbitrária; poderíamos também construir bancos de dados para 5-6-7-8, para 2-4-6-8 e assim por diante. Cada banco de dados produz uma heurística admissível, e essas heurísticas podem ser combinadas, como explicado anteriormente, tomando o valor máximo.

(6)

Uma heurística combinada desse tipo é muito mais precisa do que a distância de Manhattan; o número de nós gerados ao resolver o quebra-cabeças de 15 pode ser reduzido por um fator de 1000. Poderíamos nos perguntar se as heurísticas obtidas do banco de dados 1-2-3-4 e 5-6-7-8 poderiam ser adicionadas, já que os dois subproblemas parecem não se sobrepor. Isso ainda daria uma heurística admissível? A resposta é não, porque as soluções do subproblema 1-2-3-4 e do subproblema 5-6-7-8 para um dado estado quase certamente irão compartilhar alguns movimentos, é improvável que o 1-2-3-4 possa ser colocado no lugar sem tocar 5-6-7-8 e vice-versa.

Mas e se não contarmos esses movimentos? Ou seja, não registramos o custo total de resolver o subproblema 1-2-3-4, mas apenas o número de movimentos envolvendo 1-2-3-4. Então é fácil ver que a soma dos dois custos ainda é um limite inferior no custo de resolver todo o problema. Essa é a ideia por trás dos bancos de dados de padrão disjunto.

Com esses bancos de dados, é possível resolver 15 enigmas aleatórios em poucos milissegundos - o número de nós gerados é reduzido em um fator de 10.000 em comparação com o uso da distância de Manhattan. Para o quebra-cabeças de 24, uma aceleração de aproximadamente um fator de um milhão pode ser obtida.

Bancos de dados de padrão separados funcionam para quebra-cabeças de blocos deslizantes porque o problema pode ser dividido de forma que cada movimento afete apenas um subproblema, porque apenas um bloco é movido de cada vez. Para um problema como o Cubo de Rubik, esse tipo de subdivisão é difícil porque cada movimento afeta 8 ou 9 dos 26 cubos. Formas mais gerais de definir heurísticas aditivas e admissíveis foram propostas que se aplicam ao cubo de Rubik, mas elas não produziram uma heurística melhor que a melhor heurística não-aditiva para o problema. Aprendendo heurísticas a partir da experiência

Uma função heurística h(n) supostamente estima o custo de uma solução a partir do estado no nó n. Como um agente poderia construir tal função? Uma solução foi dada nas seções anteriores, a saber, conceber problemas relaxados para os quais uma solução ótima pode ser facilmente encontrada. Outra solução é aprender com a experiência. “Experiência” aqui significa resolver muitos quebra-cabeças, por exemplo. Cada solução ótima para um problema de 8 quebra-cabeças fornece exemplos dos quais h(n) pode ser aprendido. Cada exemplo consiste em um estado do caminho da

(7)

solução e o custo real da solução a partir desse ponto. A partir desses exemplos, um algoritmo de aprendizado pode ser usado para construir uma função h(n) que pode (com sorte) prever os custos da solução para outros estados que surgem durante a pesquisa.

Técnicas para fazer exatamente isso usando redes neurais, árvores de decisão e outros métodos são opções viáveis. Os métodos de aprendizagem indutiva funcionam melhor quando fornecidos com características de um estado que são relevantes. para prever o valor do estado, em vez de apenas com a descrição do estado bruto.

Por exemplo, o recurso "número de peças mal posicionadas" pode ser útil para prever a distância real de um estado em relação à meta. Vamos chamar esse recurso x1(n). Poderíamos obter 100 configurações de quebra-cabeças de 8 geradas aleatoriamente e coletar estatísticas sobre seus custos reais de solução. Podemos descobrir que quando x1(n) é 5, o custo médio da solução é de cerca de 14, e assim por diante.

Fornecidos esses dados, o valor de x1 pode ser usado para prever h(n). Claro, podemos usar vários recursos. Um segundo recurso x2(n) pode ser “número de pares de blocos adjacentes que não são adjacentes no estado de meta”. Como deve ser combinado x1(n) e x2(n) para prever h(n)? Uma abordagem comum é usar uma combinação linear:

h(n) = c1 x1(n) + c2 x2(n)

As constantes c1 e c2 são ajustadas para fornecer o melhor ajuste aos dados reais dos custos da

solução. Espera-se que c1 e c2 sejam positivos, porque os blocos mal posicionados e os pares

adjacentes incorretos dificultam a solução do problema. Observe que essa heurística satisfaz a condição de que h(n) = 0 para estados de meta, mas não é necessariamente admissível ou consistente.

Referências

Documentos relacionados

 São TADs representados através de listas sequenciais.. (fixas) ou encadeadas (dinâmicas), em que a seguinte regra deve

função recursiva, mais recursos de memória são necessários para executar o programa, o que pode torná-lo lento ou. computacionalmente

 Caminho simples que contém todas as arestas do grafo (e,. consequentemente, todos os

A pesquisa pode ser caracterizada como exploratória e experimental em uma primeira etapa (estudo piloto), na qual foram geradas hipóteses e um conjunto de observáveis, variáveis

Neste tipo de situações, os valores da propriedade cuisine da classe Restaurant deixam de ser apenas “valores” sem semântica a apresentar (possivelmente) numa caixa

Mestrado em Administração e Gestão Pública, começo por fazer uma breve apresentação histórica do surgimento de estruturas da Administração Central com competências em matéria

Este trabalho tem por objetivo fazer o diagnóstico dos lixões da Ilha de Santiago - Cabo Verde, bem como gerar cenários de recuperação para cada um deles através de

determinou, nomeadamente: “III - Salvo prova em contrário, de ocorrência de circunstâncias excecionais, o acordo no qual o sócio e gerente de uma sociedade garante