Você está na página 1de 54

RESOLUODEPROBLEMAS

Extrado de notas de aula do prof. Michel Gagnon cole Polytechnique de Montral http://www.professeurs.polymtl.ca/michel.gagnon/Disciplinas/Bac/IA/index_ia.html

Contedo:
Noes preliminares Representao de um problema como sistema de produo Formulao do problema Gerar e testar Busca Exerccios Algoritmos bsicos de busca (busca cega) Busca em largura bsica (breadth-first) Busca em largura a custo uniforme (Branch-and-Bound) Busca em profundidade (depth-first) Variaes sobre busca em profundidade Busca bidirecional Complexidade dos algoritmos bsicos de busca Exerccios Busca heurstica Melhor escolha(best-first) Busca em largura com custo uniforme Busca gulosa Algoritmo A* Algoritmo IDA* (A* iterativo) Algoritmo RBFS (A* recursivo) Hill-climbing (subida de encosta) Satisfao de restries: Minimizao de conflitos Limites das tcnicas de busca Exerccios Verses dos algoritmos em Prolog

Noespreliminares
Caractersticas de problemas:

Possibilidade de decompor (permite resolver por decomposiao em problemas menores). O problema das torres de Hanoi um exemplo de problema decomponvel. Natureza das etapas da soluo: Ignorveis (demonstrao de teorema) Recuperveis (quebra-cabea de 8) Irrecuperveis (xadrez) Interao com o ambiente: acesso completo --> estado nico acesso parcial --> multiplos estados (para representar os todos estados possveis, sendo que no temos o conhecimento suficiente para identificar qual o estado real) ambiente previsvel ou no --> problema contingente (exemplo: jogos de cartas, como o bridge) Avaliao da soluo (absoluta ou relativa). Tipo de soluo (caminho timo / estado desejado / satisfao de restries). Papel do conhecimento (em particular, a quantidade de conhecimento requerida). Interao com pessoa.

Representaodeumproblemacomosistemadeproduo
Tipo de problemas:

Identificao de caminho timo Estado desejado (objetivo).

Mtodo:

Avaliao da situao atual Formulao do objetivo (conjunto de estados que satisfazem o objetivo) Formulao do problema: Decidir quais aes e quais estados tm que ser considerados Abstrao (conservar apenas as informaes pertinentes) Busca: Exame de vrias seqncias de aes possveis Estratgia de contrle Execuo da soluo escolhida (modifica a situao atual)

Nota: Custo total da resoluo do problema = Custo de busca + Custo da execuo

Formulaodoproblema
A formulao do problema contm quatro elementos:

Estado inicial Operadores (definem como passar de um estado a outro estado) Teste de sucesso (determina se o estado atual corresponde ao objetivo) Funo de custo (especifica o custo para cada passo em um caminho)

Nota: O estado inicial e os operadores definem o espao de busca

Exemplo: quebra-cabea de 8 Estado inicial: 5 6 7 4 1 3 8 2

Teste de sucesso: A configurao dos quadrados tem que ser a seguinte: 1 8 7 6 2 3 4 5

Operadores: Quatro operadores que exprimem as mudanas possveis do quadrado vazio. Custo: 1 para cada passo. Exemplo de abstrao : Se o quebra-cabea representa uma imagem, precisa-se fazer uma abstrao. A cada quadrado ser associado um nmero. Com essa abstrao, o problema fica equivalente ao outro.

Importncia da tarefa de abstrao: a abstrao pode fazer a diferena entre um problema resolvel e um problema que no . Suponhamos o problema que consiste em achar o caminho mais curto entre dois pontos, considerando um conjunto de obstculos de forma poligonal (veja figura abaixo). Se permitirmos que o caminho possa passar por qualquer lugar (excluindo o espao dentro dos obstculos), provavelmente o nmero de estados a considerar tornar o problema insolvel. Se na tarefa de abstrao aproveitarmos o fato de que o caminho mais curto necessariamente constituido de linhas diretas que juntam as arestas dos polgonos, o nmero de estados a considerar ser muito menor.

Nota: A formulao do problema depende do estado inicial e do objetivo, pois as possibilidades para os primeiro e ltimo passos no caminho dependem das suas posies relativas com os obstculos.

Espaodeestados:
O espao de estado a rvore de todos os estados que podemos produzir a partir do estado inicial. A busca vai percorrer esse espao at achar o estado desejado. Exemplo: Problema das jarras de gua. Um estado representado por um par (X,Y), onde X e Y so nmeros que indicam a quantidade de gua que contm as jarras de 4 e 3 litros, respetivamente. O estado inicial (0,0) e o sistema de produo consiste nos seguintes operadores: 1. 2. 3. 4. 5. 6. (X,Y) --> (4,Y) se X < 4 (X,Y) --> (X,3) se Y < 3 (X,Y) --> (0,Y) se X > 0 (X,Y) --> (X,0) se Y > 0 (X,Y) --> (X - min(X, 3-Y), min(3, X+Y)) se Y < 3 (X,Y) --> (min(4, X+Y), Y - min(4-X, Y)) se X < 4

Os dois primeiro operadores representam a ao de encher uma das jarras. Os operadores 3 e 4 representam a ao de esvaziar uma jarra. Finalmente, os dois ltimos operadores representam a ao des transvasar (talvez parcialmente) o contedo de uma jarra na outra. O objetivo, nesse problema, de obter 2 litros de gua na jarra de 4 litros. Na nossa representao, isso corresponde ao estado (2,0). Eis uma ilustrao de parte do espao de estados que contm o estado desejado (no mostramos a continuao dos estados repetidos):

Exemplo: Problema do tabuleiro de xadrez mutilado. Nesse problema, temos um tabuleiro de jogo de xadrez onde dois quadras em cantos opostos foram cortados:

O problema consiste em cobrir totalmente o tabuleiro com pedras de jogo de domin, considerando que uma pedra cobre exatamente duas casa contguas do tabuleiro. A abstrao que ser feita nesse caso a de no considerar a cor das casas. Sendo o estado inicial o tabuleiro vazio, tem 108 estados possveis depois de ter colocado a primeira pedra de domin. Pode-se verificar que por um tabuleiro de tamanho n o nmero de possibilidades para colocar a primeira pedra 2n(n-1)-4. Para colocar a segunda pedra, o nmero de possibilidade varia entre 101 e 104, dependendo do nmero de pares de casas contguas que a pedra impede de usar:

Nesse problema, sabemos que a profundidade da rvore limitada e podemos identificar o seu valor (no sempre assim com os outros problemas). A profundidade mxima corresponde a o nmero de pedras que cabem no tabuleiro, isto , o nmero de casas dividido por 2. Nesse caso a profundidade de 31. Isso pode dar a falsa impresso que o problema ser resolvido facilmente. No assim por que o nmero de possibilidades por cada estado muito alto. O nmero de estados atingveis a partir do nvel n+1 igual a o nmero de possibilidades no nvel n menos as posies que so bloqueadas pela pedra colocada. Sabendo que o nmero mximo de posies bloqueadas 7 e chamando Pn e Pn+1 as possibilidades aos nveis n e n+1, respectivamente, vamos supor Pn+1 = Pn-7. Ento, no nosso problema, o nmero total de estados no espao ser: 108 * 101 * 94 ... = 6,84 x 1025 = 68400000000000000000000000 estados. Portanto, o problema no fcil como ele parece. Mas na abstrao que fizemos, perdemos uma informao que torna o problema muito fcil. Considerando o fato que duas casas contguas so de cores diferentes, podemos ver que uma pedra sembre cobrir uma casa preta e uma casa branca. Ento, para resolver o problema, o nmero de casas brancas deve ser igual ao nmero de casas pretas. Estudando bem o tabuleiro mutilado, podemos ver facilmente que as duas casas cortadas so brancas. Como num tabuleiro normal tem o mesmo nmero de casas brancas e pretas, no nosse tabuleiro tem 2 casas pretas a mais. Portanto, no tem soluo para esse problema. Isso mais um exemplo mostrando que a representao do problema importante.

Geraretestar
a abordagem mais simples para resolver um problema: 1. Gerar uma soluo possvel. 2. Testar se realmente uma soluo. 3. Se no for uma soluo, voltar etapa 1. Aplicvel s se conseguirmos limitar o espao de busca.

Busca
Mtodo:

Gerao dinmica de uma rvore representando os estados alcanveis a partir de um estado. A seleo do estado a ser expandido determinado pela estratgia de controle. O processo pra quando o estado designado por um nodo folha corresponde ao objetivo.

Estruturas necessrias : Nodo:


Estado Nodo pai Operador utilizado para produzir o nodo Profundidade Custo do caminho at o nodo Fila: Contm os nodos produzidos que esto esperando para ser expandidos. Esses nodos constituem a fronteira da busca.

Avaliao da estratgia de controle&:


Completude Complexidade (tempo e memria) Otimalidade

Algoritmo geral de busca : nodos <-- CRIAR-FILA(estado-inicial) loop se nodos vazio retorna falha nodo <-- TIRAR-PRIMEIRO(nodos) se TESTE-SUCESSO(nodo) tem sucesso retorna nodo novos-nodos <-- EXPANDIR(nodo) nodos <-- ACRESCENTAR-NA-FILA(nodos,novos-nodos) fim Nota: A funo EXPANDIR retorna uma lista de nodos que representam os estados resultando da aplicao de todos os operadores possveis ao estado representado por nodo. Exerccios

3.1 Eis a definio de uma clusula para procurar todos os estados sucessores de um estado, no problema das jarras ( Soluo):
sucessores(Estado,ListaSuc): findall(E,sucessor(Estado,E),ListaSuc). ?sucessores((3,0),S). S=[(0,0),(0,3),(3,3),(4,0)]

Escreva as clusulas que definem o predicado sucessor. 3.2 Usando o predicado sucessor do exerccio precedente, escreva um programa Prolog que retorna uma soluo ao problema das jarras ( Soluo):
?solucao((0,0),(2,0),S). S=[(0,0),(0,3),(4,3),(4,0),(1,3),(1,0),(0,1),(4,1),(2,3),(2,0)]

Nota: Como tem mais de uma soluo, a sua primeira soluo pode ser diferente.

3.3 Queremos achar um caminho para sair desse labirinto (o crculo vermelho representa a posio inicial):

Proponha um sistema de produo que representa o problema. (Tem que identificar como representar os estados, o estado inicial, o teste de sucesso, os operadores para passar de um estado a outro e, finalmente, a funo de custo). 3.4 Eis uma figura feita com 16 fsforos:

Queremos, minimizando o nmero de fsforos deslocados, obter uma figura que contm apenas quatro quadrados. Por exemplo, isso uma soluo com o deslocamento de trs fsforos:

Proponha um sistema de produo para representar esse problema.

Algoritmosbsicosdebusca(buscacega) Buscaemlargurabsica(breadthfirst)
Obtemos uma busca em largura se substituimos ACRESCENTAR-NA-FILA por ACRESCENTAR-NOFIM no algoritmo geral de busca: nodos <-- CRIAR-FILA(estado-inicial) loop se nodos vazio retorna falha nodo <-- TIRAR-PRIMEIRO(nodos) se TESTE-SUCESSO(nodo) tem sucesso retorna nodo novos-nodos <-- EXPANDIR(nodo) nodos <-- ACRESCENTAR-NO-FIM(nodos,novos-nodos) fim Exemplo: quebra-cabea de 8. Eis um exemplo de rvore de busca:

Os estados visitados no momento que se encontra o estado final so indicados em preto. So indicados em vermelho os estados que foram criados mas no visitados ainda. Os nmeros entre parnteses indicam a ordem de percurso dos nodos. muito importante notar que, por cada estado considerado, se ele falha no teste de sucesso utilizado para identificar o objetivo, os estados sucessores possveis so criados antes de continuar o percurso. Vantagens desse algoritmo: Completo timo, sob certas condies (por exemplo, timo se os operadores sempre tm o mesmo custo).

Desvantagens : Requer muita memria e tempo (complexidade exponencial): O(bp) onde b o fator de ramificao e p a profundidade. Nota : Se excluirmos os estados que j foram tratados, o algoritmo fica muito mais eficiente:

Nem em todos casos possvel descartar um nodo que aparece de novo no caminho. Mais para diante, veremos uma definio formal das condies que permitem isso. Exemplo pelo qual a busca em largura no d uma soluo tima : a busca do caminho mais curto entre Curitiba e Londrina:

Pode ver que a primeira soluo encontrada no tima, pois tem, nos nodos esperando para ser visitados, um que tem valor menor. Note que nesse caso eliminamos os nodos redundantes. Podemos fazer isso por que impossvel que o caminho mais curto passe duas vezes pela mesma cidade.

Buscaemlarguraacustouniforme(BranchandBound)
Modificao do algoritmo de busca em largura para aumentar o conjunto de problemas pelos quais o mtodo retorna uma soluo tima. Ao invs de dar prioridade aos nodos que se encontram no nvel menos profundo, o algoritmo escolhe o nodo que tem o menor custo. Agora, a condio para obter uma soluo tima que o custo para passar ao prximo estado nunca seja negativo. nodos <-- CRIAR-FILA(estado-inicial) loop se nodos vazio retorna falha nodo <-- TIRAR-PRIMEIRO(nodos) se TESTE-SUCESSO(nodo) tem sucesso retorna nodo novos-nodos <-- EXPANDIR(nodo) nodos <-- ORDENAR(ACRESCENTAR-NA-FILA(nodos, novos-nodos)) fim Agora, com esse algoritmo de busca, vamos encontrar primeiro o caminho mais curto at Londrina (a ordem de processamento dos nodos indicada com os nmeros azuis que aparecem dentro de crculos):

Vantagens desse algoritmo: Completo timo, se o custo at o prximo nodo nunca negativo. Desvantagens : Complexidade em memria e tempo igual da busca em largura: O(bp) onde b o fator de ramificao e p a profundidade.

Buscaemprofundidade(depthfirst)
Obtemos uma busca em profundidade se substituimos ACRESCENTAR-NO-INICIO por ACRESCENTAR-NO-FIM no algoritmo geral du busca:

nodos <-- CRIAR-FILA(estado-inicial) loop se nodos vazio retorna falha nodo <-- TIRAR-PRIMEIRO(nodos) se TESTE-SUCESSO(nodo) tem sucesso retorna nodo novos-nodos <-- EXPANDIR(nodo) nodos <-- ACRESCENTAR-NO-INICIO(nodos,novos-nodos) fim

Vantagens : Econmico em memria. As vezes, pode achar a soluo muito rapidamente (especialmente se tem muitas solues). Desvantagens : No completo. A busca pode entrar em um loop infinito, especialmente se o domnio dos estados infinito. No tem certeza que vai retornar uma soluo tima. A primeira soluo no necessariamente a melhor. Supondo, por exemplo, estamos procurando um caminho entre Guarapuava e Maring, a busca pode entrar em loop infinito se no evitamos passar duas vezes pela mesma cidade:

Se, ao contrrio, evitamos retornar mesma cidade, achamos rpidamente uma soluo:

Mas essa soluo no tima. A soluo tima est escondida nos nodos que no foram visitados:

importante notar que o algoritmo de busca em profundidade, se ele menos exigente em memria, no melhor que a busca em largura no que se refere ao tempo de execuo. Depois da expanso de um nodo, a ordem da apario dos nodos filhos na pilha influencia muito a busca. Veja por exemplo como a ordem pode tornar muito ruim a busca do caminho entre Guarapuava e Maring:

Variaessobrebuscaemprofundidade
At agora a busca em profundidade a tcnica mais vantajosa em termos de uso da memria. Infelizmente, ela apresenta a desvantagem de no necessriamente retornar uma soluo (ou mergulhar demais antes de voltar a un nvel de profundidade mais baixa onde se encontra a soluo). Existem duas tcnicas baseada na busca em profundidade para contornar esse problema: a busca com profundidade limitada e a busca em profundidade iterativa. Busca com profundidade limitada: Escolhe-se um valor limite de profundidade que a busca no pode ultrapassar. Isso vai dar certo somente se pudermos confiar que a soluo encontra-se dentro desse limite. Se no escolhermos o bom valor de limite de profundidade, pode no retornar uma soluo. Esse tipo de busca resolve o problema da incompletude mas ainda possvel que seja retornada uma soluo no tima.

Busca em profundidade iterativa: Compromisso entre a busca em largura e a busca em profundidade. Nesse caso, tentamos primeiro uma busca em profundidade com limite de profundidade 0. Se no encontramos uma soluo, repetimos com limite de profundidade 1, 2, 3 e assim por diante at achar uma soluo. Essa soluo tem a vantagem de economia em memria, pois a busca em profundidade que utilizada, e tambm vai achar a soluo tima (se a funao de custo uniforme), pois no passamos a um nvel superior de profundidade antes de ter esgotado o nvel precedente. Esse algoritmo adequado se o espao de estados grande e a profundidade da soluo no conhecida. A complexidade em tempo igual da busca em largura. A complexidade em memria igual da busca em profundidade. Para ilustrar a busca em profundidade iterativa, considere o seguinte espao de estado (suponhamos que o custo de um estado para outro 1):

fcil ver que uma busca em profundidade pode retornar a soluo no tima ABCG. Com uma busca em profundidade iterativa, uma primeira busca ser realizada at o nvel 0. Nesse caso somente o estado A ser visitado. Como isso no o estado final, recomeamos uma busca at o nvel 1. Eis uma ilustrao dessa busca (usamos nmeros entre parnteses para indicar a ordem de visita dos estados):

De novo no encontramos uma soluo. Uma nova busca realizada, nessa vez at o nvel 2, e uma soluo (tima) retornada:

A busca em profundidade iterativa parece muito ineficiente pois o mesmo nodo pode ser expandido muitas vezes. Quando fazemos mais uma iterao para o nvel n+1, todos os nodos que foram criados no nvel n vo ser criados de novo. Mas surpreendentemente, o algoritmo no muito mais ineficiente que a busca em largura. Por exemplo, com um fator de ramificao de 10, o nmero de nodos expandidos, em relao busca em largura, somente 11% maior. Com a busca em profundidade iterativa, obtemos um comportamento idntico busca em largura no que concerne a completude e a otimalidade, mas com um uso de memria mais vivel. Contudo, se a funo de custo no uniforme, ele tem tambm o mesmo defeito que a busca em largura: possvel que a resposta retornada no seja tima. Uma soluo a esse problema seria uma busca onde a cada iterao, ao invs de incrementar o limite de profundidade, incrementamos o limite de custo. Uma tcnica semelhante ser apresentada mais para frente.

Buscabidirecional
Duas buscas so realizadas em paralelo. Uma a partir do estado inicial e outra a partir do objetivo. Temos uma soluo quando as duas se encontram. Para poder utilizar essa soluo, temos que respeitar as seguintes exigncias:

Os operadores devem ser reversveis. No sempre possvel calcular o predecessor de um nodo. Por exemplo, se o objetivo de comprar um mximo de itens com menos dinheiro possvel, j difcil representar o estado final, ainda mais os predecessores desse estado. Alm de definir qual tipo de busca realizada nas duas direes de maneira a maximizar as chances delas se encontrarem, precisamos de um mtodo para verificar o encontro.

Complexidadedosalgoritmosbsicosdebusca
Eis uma tabela que resume a complexidade dos algorimtos bsicos de busca: Prof. Ampl. Tempo Memria Sol. tima Completude bm bm No No bd bd Sim* Sim Custo unif. bd bd Sim** Sim Prof. limit. bl bl No Sim, se l >= d Prof. iterat. bd bd Sim* Sim

b = fator de ramificao d = profundidade da soluo l = limite de profundidade especificado m = profundidade mxima atingida na busca
*

Somente se o custo para de um estado ao prximo sempre o mesmo (funo de custo uniforme). Somente se o custo no diminua quando o caminho aumenta.

**

A seguinte figura mostra intuitivamente, para as buscas em profundidade e em largura, quais so os nodos esperando quando o nodo indicado por o ponto cinza est visitado:

Pode ver que o algoritmo de busca em largura tem muito mais nodos esperando, ento muito mais "guloso" em memria. Exerccios

3.5 Considere o seguinte problema. Temos uma matriz de 3x3 e devemos colocar em cada posio uma letra do alfabeto de tal maneira que todas linhas e colunas formem uma palavra que existe em portugus. Eis um exemplo de soluo para esse problema:

p o s

u v a

s o l

Suponha que uma posio sem letra representada pela constante vazio e que existe uma base de fatos que representa as palavras do portugus:
palavra([a,l,o]). palavra([p,u,s]). ... palavra([s,a,l).

Considere agora as duas seguintes maneiras de representar um estado no espao de busca:

Primeira abordagem: Representamos um estado utilizando uma matriz exatamente como na questo 4. Por exemplo, o estado ilustrado na figura 1a teria a representao ilustrada em 1b. Segunda abordagem: Utilizamos uma lista de 9 elementos, onde cada posio na lista corresponde ordem ilustrada na figura 1c. O estado da figura 1a seria representado como ilustrado em 1d.
[[p,u,s], [o,vazio,vazio], [vazio,vazio,vazio]]

p o

1 4 7

2 5 8

3 6 9
[p,u,s,o,vazio,vazio,vazio,vazio,vazio]

(a)

(b)

(c )

(d)

a) Sabendo que o problema ser implementado como um sistema de produo (estado inicial, operadores para produzir os estados sucessores, teste de sucesso, funo de custo), identifique as vantagens e desvantagens dessas duas representaes. b) Supondo que voc tem a possibilidade de utilizar o algoritmo breadthfirst ou o algoritmo depthfirst, qual ser o melhor, considerando o espao de busca desse problema (justifique).

Buscaheurstica
Uma busca heurstica uma busca que utiliza uma funo h(n) que, por cada nodo n do espao de busca, d uma avaliao do custo para atingir o estado final. A funo h(n) chamada funo heurstica.

Melhorescolha(bestfirst)
O algoritmo de busca pela melhor escolha o seguinte: nodos <-- CRIAR-FILA(estado-inicial) loop se nodos vazio retorna falha nodo <-- TIRAR-MELHOR-NODO(nodos) se TESTE-SUCESSO(nodo) tem sucesso retorna nodo novos-nodos <-- EXPANDIR(nodo) nodos <-- ACRESCENTAR(nodos,novos-nodos) fim A diferena entre ese algoritmo e o algoritmo geral que ele usa uma funo f(n), que d um valor a cada nodo n da lista dos nodos abertos (os nodos que esto esperando para ser expandidos). O nodo que tem o menor valor escolhido para continuar a busca. Vamos ver agora os algoritmos que resultam de diferentes definies da funo f(n).

Buscaemlarguracomcustouniforme
Se utilizamos a funo f(n) = g(n), onde g(n) d o custo de estado inicial at o nodo n, obtemos o algoritmo de busca em largura com custo uniforme. J sabemos que esse algoritmo no garante uma soluo tima.

Buscagulosa
Se f(n) = h(n), onde h(n) uma estimao do custo do caminho mais curto do nodo n at o objetivo, o resultado uma busca "gulosa" , porque sempre vai escolher o maior passo possvel, sem se preocupar se no final vai se obter a melhor soluo. Por exemplo, para achar o caminho de Guarapuava at Curitiba, a escolha inicial entre as seguintes cidades: Cascavel, Campo Mouro, Jandaia do sul, Ponta Grossa e Irati. O algoritmo vai escolher Ponta Grossa, pois o mais perto de Curitiba. Ento, o algoritmo vai dar uma resposta no tima, pois o caminho que passa por Irati mais curto.

AlgoritmoA*
Uma maneira de melhorar os dois algoritmos precedentes de combinar as duas funes: f(n) = g(n) + h(n). Obtemos assim o algoritmo A. Essa funo estima o custo total do estado inicial at o objetivo.

A obteno da soluo tima depende da funo heurstica. Se h(n) no faz uma boa avaliao do custo at o objetivo, tem chance de "perder" a soluo tima. Algoritmo A* e heurstica admissvel Obtemos o algoritmo A* quando o algoritmo A usa uma heurstica h(n) admissvel. Uma heurstica admissvel se para cada nodo, o valor retornado por esta heurstica nunca ultrapassa o custo real do melhor caminho desse nodo at o objetivo. No exemplo do caminho de Curitiba at Londrina, o algoritmo acha a soluo diretamente, se utilizarmos a seguinte heurstica: h(n) = distncia em linha reta at a destinao

Completude do algoritmo A*: Como o algoritmo sempre expande o nodo que minimiza a funo f(n) e que f(n) sempre retorna um valor que no ultrapassa o custo real para atingir o objetivo, necessariamente o algoritmo vai achar uma soluo, se ela existe. Mas tem duas condies: 1. No existe nodo com fator de ramificao infinito. 2. No existe caminho com custo finito mas com nmero infinito de nodos. Prova da otimalidade do algoritmo A*: Seja G o estado final de uma soluo tima, f* o custo dessa soluo tima, e G2 o estado final de uma soluo no tima com custo g(G2) > f* (veja ilustrao abaixo). Suponhamos que o algoritmo A* visita G2 primeiro. Ento existe, nas lista dos nodos abertos, um nodo n que faz parte do caminho at G. Como a funo h(n) admissvel, temos f* >= f(n). Visto que G2 foi selecionado antes de n, temos tambm f(n) >= f(G2). Como f* >= f(n), podemos deduzir f* >= f(G2).

G2 sendo o estado final, f(G2) = g(G2) + 0. Ento, f* >= g(G2), o que contradiz a hiptese.

A escolha da funo heurstica No sempre fcil identificar uma boa funo heurstica para resolver um problema. Depende muito das caractersticas do problema. Exemplo do quebra-cabea de 8: h1(n) = nmero de quadrados em uma posio errada. h2(n) = soma das distncias que separam os quadrados das posies finais. Com a funo h2(n), o espao de estados gerado menor. Ento, o algoritmo acha mais rapidamente a soluo. Espao de estados gerado com h1(n) (para cada estado indicamos entre parnteses o valor da funo heurstica):

Espao de estados gerado com h2(n):

Eliminao das redundncias e monotonicidade:

No exemplo do quebra-cabea de 8, no consideramos os nodos que aparecem por mais de uma vez. Por exemplo, a expanso do segundo nodo pode reproduzir o estado inicial. No conservamos esse nodo porque, nesse caso, temos certeza que cada nova apario de um estado no pode ter um valor f(n) menor. Mas no sempre assim. Normalmente, quando un nodo aparece de novo, temos que compar-lo com o nodo j existente, e conserv-lo s se tiver um valor menor. No exemplo do quebra-cabea de 8, a simplificao possvel porque a funo heurstica h(n) monotnica. Uma heurstica monotnica uma funo que respeita a seguinte condio: Para todo estado ni e nj onde nj um descendente de ni, temos h(ni) - h(nj) =< custo real de ni at nj. Com uma heurstica monotnica, f(n)=g(n)+h(n) tem a caracterstica de ser uma funo no decrescente. Uma consequncia importante disso que na primeira vz que um nodo visitado (cuidado: isso no inclui os nodos abertos) para ser expandido, temos certeza que o caminho at esse nodo timo . Isso significa que cada vez que esse nodo ser visitado novamente, no ser necessrio expandi-lo. Aqui um exemplo onde a funo heurstica no monotnica (ao lado de cada estado, indicamos entre parnteses o valor retornado pela funo heurstica):

Nesse exemplo, o estado C vai aparecer uma segunda vez na busca, mas com valor menor, como mostra a seguinte figura (a cada nodo indicamos o valor retornado por f(n):

Nesse caso, podemos mostrar que a funo h(n) no monotnica: a diferena de custo entre B e C 1, enquanto a diferena entre os valores h(n) 5. A consequncia disso que o valor de f(n) diminuiu de B para C. O uso de uma funo monotnica pode fazer uma grande diferena no desempenho da busca. Considere o que acontece quando um nodo visitado de novo. Se a funo monotnica, a nica coisa que devemos fazer verificar, na lista dos nodos fechados, se ele no existe. Se ele existe, podemos descartar essa nova ocorrncia do nodo. Se a funo no monotnica, deveremos tambm comparar os valores dos dois nodos, caso ele j existe na lista dos fechados. Se a nova ocorrncia do nodo tem um valor menor, deveremos aplicar um desses procedimentos:

Eliminar da memria o antigo nodo e todos os seus descendentes. Ao invs de apontar no novo nodo, apontar no antigo, e atualizar o valor de todos os descendentes desse nodo. No exemplo acima, o resultado seria o seguinte:

Essas duas abordagens tm um custo computacional no desprezvel que evitado com uma funo monotnica. Avaliao de uma funo heurstica: Para avaliar uma funo heurstica, bom entender bem o efeito dela na busca. Suponhamos que, no problema considerado, a expanso de um nodo resulta na criao de b novos nodos, em mdia (em outros termos, o fator de ramificao mdio b). A conseqncia da funo heurstica que apenas alguns desses nodos vo ser visitados na busca da soluo. Para entender melhor, consideramos a seguinte ilustrao de um espao de busca, onde o estado final representado por F, e onde as linhas grossas representam os caminhos at os nodos que foram visitados pelo algoritmo:

Com esse exemplo, podemos perceber que o fator de ramificao real aproximativamente 2. Se considerarmos s os nodos visitados pelo algoritmo, o fator de ramificao seria um valor perto de 2. Esse ltimo valor o fator de ramificao efetivo e pode ser usado para avaliar uma funo heurstica. Seja N o nmero de nodos criados para obter a soluo e d a profundidade da soluo. O fator de ramificao o valor b* que respeita essa equao N = 1 + b* + (b*)2 + ... + (b*)d Uma boa heurstica tem um valor b* mais prximo possvel de 1. No caso do quebra-cabea de 8, o fator de ramificao mdio 2,67. Ento, temos 1 < b* < 2,67. Os resultados com as heurstica h1(n) = nmero de peas mal colocadas e h2(n) = soma das distncias at posio final so os seguintes: d 2 10 20 h1(n) 1,79 1,38 1,47 h2(n) 1,79 1,22 1,27

Uma outra maneira de avaliar uma heurstica compar-la com uma outra heurstica. Se h1(n) e h2(n) so duas heursticas admissveis, a melhor a que sempre d os valores maiores. Diz-se que a heurstica que d o maior valor mais informada. Prova: Seja h2(n) a funo de maior valor, quer dizer, h2(n) domina h1(n), e f* o custo da soluo tima. O algoritmo A* vai visitar todos os nodos que tem valor f(n) =< f*. Toda vez que um nodo ser expandido com h2(n), ele ser tambm com h1(n) Pode existir um n por o qual o valor de h1(n) permitir a expanso de um nodo e o valor de h2(n) faria a funo f(n) ultrapassar o custo do caminho timo. Nesse caso, o nodo nunca seria expandido com a funo h2(n). Ento, menos nodos sero expandidos com a

funo h2 Como achar uma funo heurstica: No tem receita para identificar uma boa funo heurstica. Temos que analizar as caractersticas do problema e usar a nossa intuio para achar a boa heurstica. Mas, podemos usar algumas dicas:

Imaginar o mesmo problema com menos restries Se no tiver jeito de escolher entre duas heursticas h1(n) e h2(n), usar h(n)=max(h1(n),h2(n)), que tambm admissvel e domina as duas. Usar informaes estatsticas. Identificar as caractersticas de um estado que so teis para definir a heurstica.

Notas adicionais:

O custo do clculo da funo heurstica tem que ser bem menor que o custo para expandir um nodo. Seno, no vale a pena calcular o valor heurstica, pois seria mais barato fazer a expanso. Ento, temos que achar um equilbrio entre os dois custos. Pode existir outras razes que a redundncia para eliminar um nodo. Por exemplo, usando o algoritmo A*, podemos eliminar um nodo cujo custo ultrapassa o custo da soluo tima. claro que isso funciona s se tem jeito de ter essa informao. Mas em alguns tipos de problema, isso possvel. Por exemplo, se quisermos achar o melhor jeito da fazer compras gastando menos dinheiro possvel, podemos cortar um nodo que representa um estado onde no temos mais dinheiro. O custo de A* em memria e tempo e exponencial, assim como a busca em largura, apesar de ser mais vivel que essa ltima em muitos casos reais. No existe algoritmo que expande menos nodos que A*. Mas mesmo assim, em problemas muito difceis o algoritmo A* ser ineficiente.

AlgoritmoIDA*(A*iterativo)
O maior problema com A* o uso da memria. Para contornar esse problema, podemos utilizar a mesma tcnica que foi utilizada para a busca cega: uma verso iterativa do algoritmo. A idia o seguinte. Calculamos o valor f(n) do estado inicial. Como a soluo tima no pode ter um custo menor, realizaremos uma busca em profundidade na qual sero expandidos somente os nodos que no ultrapassam esse limite. Se, de todos os nodos visitados, nenhum a soluo, recomeamos uma nova busca, aumentando o limite. Qual ser o melhor valor para o novo limite? Considere os nodos que no foram expandidos. Um deles minimiza o valor f(n). Como a soluo tima no pode ter um valor menor, recomearemos com esse novo valor. Assim por diante at que o estado final seja visitado. Para ilustrar o algoritmo, considere o seguinte espao de estado (entre parnteses indicado o valor h(n) para cada estado):

Suponhamos que G o estado inicial e K o estado final. Eis a rvore de busca no momento que A* encontra a soluo:

Nesse exemplo, aproveitamos da monotonicidade da funo: os nodos A e D foram descartados na segunda ocorrncia. Note que no final da busca, tem 10 nodos na memria: 6 nodos fechados (incluindo o estado final) e 4 nodos abertos. Vamos ver agora como o mesmo problemas ser resolvido com o algoritmo IDA*. Como f(G) = 0 + 10 = 10, a primeira busca expande todos os nodos que tem um valor que no ultrapassa 10. Somente G ser expandido (os nmeros em azul na esquerda indicam a ordem de visita e os nmero em vermelho na direita indicam o valor f(n)):

Nos nodos abertos, o com menor valor o nodo C, com o valor 15. Ento, uma nova busca em profundidade realizada, como limite de 15:

Agora recomeamos uma busca com limite de 20:

Note que apareceu uma soluo, mas ela no retornada porque o seu valor ultrapassa o limite. Finalmente, recomenando com o menor valor dos nodos abertos, 25, obtemos a soluo tima:

Nesse exemplo, o maior espao de memria usada foi na ltima iterao, que tem dois nodos esperando na pilha. O pior caso, nesse exemplo, seria uma busca que visite, nas duas ltimas iteraes, o nodo A antes do nodo C, e depois o nodo H antes dos nodos D e B. Nesse caso, teramos quatro nodos esperando na pilha como ilustrado na seguinte figura:

Connclundo, o algortimo IDA* reduziu de 10 para 4 (no pior caso) o nmero de nodos ocupando o espao de memria. uma melhoria importante. Passamos de um uso exponencial de memria a um uso proporcional profundidade mxima atingida.

AlgoritmoRBFS(A*recursivo)
O algoritmo RBSF (Recursive Best-First Search) tambm apresenta um uso de memria semelhante ao da busca em profundidade. A idia consiste em memorizar para cada nodo n o menor valor entre o seu valor f(n) e os valores de todos os seus descendentes. Para realizar essa atualizao, aplicamos o seguinte algoritmo: 1. Seja n o ltimo nodo expandido, e n1, n2, ..., ni, os nodos resultando dessa expanso. 2. Se o menor dos valores f(n1), f(n2), ..., f(ni) maior que f(n), substituimos o valor f(n) por esse valor. 3. Repetimos esse processo, comparando os valores de n e seus irmos com o valor do pai de n. Essa propagao pra quando encontramos um pai que no tem um valor inferior ao menor de seus filhos. Depois dessa atualizao, todo nodo temo um limite inferior do custo total. A busca tenta efetuar a expanso em profundidade. Quando existe um nodo que apresenta um valor mnimo e que no no nvel mais profundo da busca, apagamos todos os nodos que esto em um nvel de profundidade maior que esse nodo mnimo, e recomeamos a expanso a partir desse nodo. Vamos ver agora a aplicao desse algoritmo ao nosso exemplo. O estado inicial tem o valor 10. Depois da expanso, aparecem o nodos A e C, com custo 20 e 15 respectivamente. J sabemos que, qualquer seja o caminho da soluo tima, ele passa por A ou C. Ento, o estimativo inicial, que era 10, otimista demais, pois sabemos agora que no pode ser menor que 15, passando por C. Ento, devemos diparar o mecanismo de atualizao:

O prximo nodo expandido o nodo C:

Nesse caso, o algoritmo de atualizao no altera os valores, pois o novo nodo criado no tem um valor maior que seu pai. Como esse novo nodo tem o menor valor, ele expandido, produzindo uma situao que deve ser atualizada:

Depois da atualizao, o nodo A que tem o menor valor. Ento, devemos considerar esse nodo e esquecer a busca abaixo do nodo C. Note que no perdemos tudo, pois memorizamos o custo da busca passando por C:

Recomeando a expanso a partir de A chegamos, em duas etapas, a uma nova situao que exige atualizao dos valores:

Agora, temos dois nodos candidatos que apresentam o menor valor (C e D), e nenhum deles se encontra no nvel mais profundo. Qualquer seja o nodo escolhido, ser preciso apagar alguns nodos. Suponhamos que o mais profundo escolhido, isto , o nodo D. O apagamento resulta na seguinte situao:

Expandindo o nodo D, obtemos a seguinte situao:

De novo, o nodo de menor valor no est no nvel mais profundo. Nese caso, devemos apagar tudo at o nvel do nodo C:

A partir desse nodo, chegaremos finalmente soluo tima:

Subidadeencosta(hillclimbing)
A idia a seguinte. Propor uma configurao e modific-la at a obteno de uma soluo. importante notar que no se tem certeza de achar uma soluo tima. um mtodo local, no sentido de que a cada momento o algoritmo considera somente os estados imediatamente acessveis a partir do estado atual. como se fosse realizada uma busca em profundidade, esquecendo todos os nodos que no foram escolhidos a cada nvel da rvore. Eis os algoritmo, supondo que temos uma funo f(n) que queremos maximizar: 1. Identificar o estado atual com o estado inicial: natual = estado inicial. Em certas aplicaes, o estado inicial pode ser gerado aleatoriamente. 2. Identificar todos os estados sucessores possveis de natual e calcular, para cada estado sucessor n, o valor f(n). Seja ni o estado sucessor que tem o maior valor. 3. Se f(ni) < natual, retornar natual. Isso significa que o algoritmo encontrou um estado que maximiza a funo f(n). 4. Seno, natual = ni e voltar etapa 2. claro que, se o objetivo de minimizar a funo f(n), o mesmo algoritmo, s que conservamos o estado que tem o menor valor e o algoritmo retorna o estado atual quando f(ni) > natual Exemplo: Palavras cruzadas Suponhamos uma grade de 3x3 que devemos preencher com letras que formam palavras vertical e horizontalmente. Eis uma soluo:

p o s

u v a

s o l

Para usar o hill-climbing com esse problema, poderiamos preencher cada posio com uma letra escolhida aleatoriamente para obter o estado final. Uma funo de avaliao possvel o nmero de linhas ou colunas que formam uma palavra. Para passar de um estado a outro estado, uma letra trocada por outra. Problemas com o algoritmo hill-climbing:

Ele pode se encontrar em um mximo local. Como ele sempre "sobe" e pra quando ele se encontra em um cume, se tiver outro cume mais alto no espao de estados, ele no vai retornar essa soluo. Pior ainda, se no cume que ele encontrou o estado no corresponde soluo esperada, ele no retorna uma soluo. Planaltos. Isso acontece quando todos o estados sucessores tem mais ou menos o mesmo valor. Nesse caso, o algoritmo vai "andar" aleatoriamente nessa regio. Esse problema vai acontecer no nosso exemplo das palavras cruzadas.

Solues

Gerar uma outra configurao aleatoriamente e recomear a partir desse novo estado. Tmpera simulada. A idia de permitir ao algoritmo escolher, de vez em quando, um estado que tem um valor menor. A probabilidade de fazer tal escolha diminui medida que a busca progride.

No sempre fcil achar uma heurstica para tornar eficiente o algoritmo de subida de encosta. Considere por exemplo uma situao onde o objetivo de inverter os blocos que formam uma pilha: Exemplo do mundo de blocos: Suponhamos que queremos obter uma configurao especfica de blocos. Poderiamos usar a seguinte heurstica: +1 para cada cubo sobre o cubo certo -1 para cada cubo no posicionado sobre o cubo certo Suponhamos que o objetivo de colocar o bloco D sobre C, C sobre B, B sobre A e A sobre a mesa. A seguinte figura ilustra que pode acontecer que a heurstica, por retornar o mesmo valor, no ajuda para escolher o prximo estado. Nesse caso, devemos escolher aleatoriamente, o que pode nos afastar do bom caminho:

Com o mesmo problema, o algoritmo funcionar melhor com a seguinte eurstica: +n para cada cubo cuja estrutura de n cubo que o suporta correta -n para cada cubo cuja estrutura de n cubo que o suporta no correta

Nesse caso, podemos verificar que o algoritmo vai chegar rapidamente ao estado final.

O mtodo de subida de encosta equivalente busca em profundidade sem a memria das alternativas, ou a um gerar-e-testar inteligente. O algoritmo funciona bem quando as etapas do problema so recuperveis, isto , um problema no qual nunca chegamos em um estado de onde impossvel sair.

Satisfaoderestries:
Nessa seo apresentada uma tcnica de resoluo onde o problema representado por um conjunto de variveis a serem instanciadas e um conjunto de restries sobre essas variveis. Nesse tipo de problema, a sequncia de passos para atingir o estado final na maioria dos casos irrelevante. O que queremos identificar um valor para cada varivel de tal maneira que todas as restries sejam respeitadas. Vamos nos limitarmos a um caso especfico, onde as variveis tm um domnio finito. Os domnios das variveis no so limitados a conjuntos de valores. Podem ser de qualquer tipo. As restries so grupadas em dois tipos: as equaes e os procedimentos. Eis alguns exemplos do primeiro tipo: X < 4, Y = X+Z, X 0. O segundo tipo se refere s restries que so definidas por um procedimento. Por exemplo, se X e Y representam pessoas, e queremos que elas sejam de sexos diferentes, poderiamos representar isso por uma restrio sexo_dif(X,Y) definida da seguinte maneira em Prolog: sexo_dif(X,Y): mulher(X),homem(Y). sexo_dif(X,Y): mulher(Y),homem(X). Uma maneira simples de resolver esse tipo de problema utilizar a tcnica Gerar e Testar: 1. Escolher um valor para cada varivel do problema. 2. Verificar se as restries so respeitadas. 3. Se elas so, terminar. Seno voltar etapa 1. interessante aqui discutir como ser escolhida cada nova proposta de soluo. O mtodo mais natural consiste em usar o retrocesso cronolgico (backtrack). Sejam X1, X2, ..., Xn as n variveis que compem o problema. Primeiro, escolhemos um valor para cada varivel nessa ordem. Se preciso voltar etapa 1, voltamos ltima varivel que anda contm valores no seu domnio que no foram escolhidos. Seja Xi essa varivel. Selecionamos o prximo valor do domnio que no foi selecionado at agora. Para todas as variveis que vm depois na sequncia, recomeamos a seleo a partir do incio do domnio. Para entender melhor, considere o exemplo ilustrado na seguinte figura, onde temos um mapa a ser colorido minimizando o nmero de cores utilizadas e de tal maneira que no tenha duas reas contguas coloridas com a mesma cor:

Esse problema pode ser representado pelo conjunto de variveis {A, B, C, D, E, F} e as seguintes restries: A A A B B C C E D B C E E F E F F F

Supondo que toda varivel tem por domnio o conjunto de cores {azul, vermelho, roxo} e que as instanciaes so feitas na sequncia A, B, C, D, E e F, a primeira resposta retornada ser a seguinte: A B C D E F

1 azul azul azul azul azul azul Como essa proposta rejeitada pelas restries, voltamos ltima varivel que tem mais valores a propor, que a varivel F. Obtemos assim uma nova proposta onde F tem o valor vermelho, que tambm rejeitada. Mesma coisa com o ltimo valor possvel para F: A B C D E F

2 azul azul azul azul azul vermelho 3 azul azul azul azul azul roxo No prximo backtrack, voltaremos varivel E, pois todas as possibilidades foram esgotadas com a varivel F. O prximo valor selecionada para E a cor vermelho. Agora voltamos a selecionar um valor para F, recomeando no incio do domnio. Obteremos assim mais trs possibilidades: A B C D E F

4 azul azul azul azul vermelho azul 5 azul azul azul azul vermelho vermelho 6 azul azul azul azul vermelho roxo Continuando, obteremos uma soluo depois de 124 tentativas:

A 7 8 9

C azul azul azul azul ...

D azul azul azul

E roxo roxo roxo

F azul vermelho roxo azul ...

azul azul azul azul azul azul

10 azul azul ... ... ...

vermelho azul ... ...

123 azul vermelho vermelho vermelho vermelho roxo 124 azul vermelho vermelho vermelho roxo azul

Nesse exemplo, a busca no atingiu uma largura dramtica, mas em casos reais a situao rapidamente fica invivel. O principal problema aqui que verificamos as restries somente quando todas as variveis so instanciadas. Mas na maioria dos casos, podemos detectar conflitos antes mesmo de terminar as instanciaes. Na linha 1, por exemplo, no preciso continuar depois de ter atribudo a cor azul a A e B, pois j temos uma restrio violada. J poderamos retroceder. Eis as etapas at a soluo, usando essa tcnica (note que nessa lista, cada etapa corresponde instanciao de uma varivel): A 1 azul 2 azul azul 3 azul vermelho 4 azul vermelho azul 5 azul vermelho vermelho 6 azul vermelho vermelho 7 azul vermelho vermelho 8 azul vermelho vermelho 9 azul vermelho vermelho 10 azul vermelho vermelho azul azul azul azul azul azul Backtrack Backtrack Backtrack B C D E F

vermelho Backtrack roxo roxo azul Backtrack

11 azul vermelho vermelho 12 azul vermelho vermelho 13 azul vermelho vermelho 14 azul vermelho vermelho 15 azul vermelho vermelho 16 azul vermelho vermelho 17 azul vermelho vermelho

azul azul vermelho vermelho vermelho vermelho vermelho

roxo roxo

vermelho roxo

Backtrack Backtrack

azul

Backtrack

vermelho Backtrack roxo roxo azul Soluo

A primeira tentativa bloqueada antes de instanciar a varivel C porque j nesse momento a restrio A B est violada. Ento, a busca volta para B, lhe atribuindo um novo valor, vermelho. Agora possvel instanciar C, mas no poderemos ir alm, porque o valor atribudo a C viola a restrio A C. Continuando assim, encontramos uma soluo que necessitou a gerao de somente quatro instanciaes completas, e nove pedidos de backtrack. um progresso impressionante, comparada abordagem anterior. importante notar aqui que o custo para obter uma instanciao completa maior, pois devemos testar as restries a cada instanciao. Esse custo compensado pelo fato de obter uma busca muito mais limitada. Mas mesmo assim, possvel reduzir o custo. A cada instanciao, no preciso testar TODAS as restries. suficiente testar unicamente as que contm a varivel instanciada. Portanto, se tiver um armazenamento dar restries indexado pelas variveis, ser possvel testar somente as restries necessrias a cada instanciao. Uma outra maneira de melhorar ainda mais a busca usar o forward-checking. A idia de olhar, considerando os valores j atribudos e as restries, se possvel reduzir o domnio das outras variveis no instanciadas. Por exemplo, assim que a cor azul for escolhida para A, podemos excluir essa cor dos conjuntos de B, C e E. Alm de limitar as possibilidades na busca, essa tcnica tem o efeito desejvel de disparar mais rapidamente o backtrack. Diminuindo assim os domnios das variveis no instanciadas enquanto avanamos na busca, pode acontecer que uma dela se encontre com um domnio vazio. Assim poderemos efetuar um backtrack antes mesmo de terminar as instanciaes. Eis as etapas na resoluo de nosso problema (para cada varivel no instanciada indicamos o conjunto de valores possveis):

A B C D E

{a, {a, {a, {a, {a, {a, 0 v,r v,r v,r v,r v,r v,r } } } } } } {a, {a, {v, {v, {v, v,r v,r r} r} r} } } {a, {v, {a, v,r {r} r} r} } {a, {a, v,r {r} r} } a a {r} {r} r {} Backtrack {a, r} {a, r} a

1 a

2 a

3 a

4 a 5 a

v v

v v

6 a

{r}

7 a

8 a

Nessa vez, a resposta veio mais rpida ainda. Mas isso tambm teve um custo. No somente verificamos as restries a cada instanciao de varivel mas tambm devemos fazer um clculo para atualizar o domnios das variveis no instanciadas. Esse custo poder ser no desprezvel. Em vrios casos, o forward-checking fica vantajoso apesar do custo. No nosso exemplo, h um aspecto que no foi considerado e que tem uma importncia considervel na obteno da soluao: a ordem de instanciao das variveis. Considere por exemplo a ordem D, A, B, C, E, F. Nesse caso, usando o forward-checking, a busca fica mais demorada:

D A B C E

{a, {a, {a, {a, {a, {a, 0 v,r v,r v,r v,r v,r v,r } } } } } } {a, {a, {a, {a, {v, v,r v,r v,r v,r r} } } } } {v, {v, {v, {v, r} r} r} r} {v, {r} {r} r} v v r {r} {r} r {} Backtrack

1 a

2 a

3 a

4 a 5 a 6 a

a a a

v v v

{} {} Backtrack

7 a

{v, {v {v r} } } v {} {} Backtrack {v {v } } v {} Backtrack

8 a

9 a

10 a

11 a

{a, {a, {a, {v, r} r} r} r} {a, {v, {r} r} r} {v, r} {v }

12 a

13 a

{r}

14 a

15 a

Soluo

A busca quase o dobro com essa ordem. A questo agora a seguinte: existe uma maneira de determinar a ordem de instanciao das variveis para otimizar a busca? A resposta sim. Eis as heursticas para escolha da ordem de instanciao:

Escolher a varivel mais restringida (a que contm o menor domnio). Escolher a varivel implicada em mais restries.

Se tentamos resolver nosso problema com essas heursticas, obtemos imediatamente a soluo (note que normalmente, em problemas reais, no assim, ainda tem que buscar um pouco!): Varivel mais restringida A B C D E F {a, {a, {a, {a, {a, {a, 0 v,r v,r v,r v,r v,r v,r } } } } } } {a, {a, {v, {v, {v, v,r v,r r} r} r} } } {a, {v, {a, v,r {r} r} r} } {a, {v v,r r } } {a, v,r r } {v, r r} v r

1 a

2 a

3 a

{a }

4 a

{a }

5 a

6 a

Soluo

Varivel envolvida em maior nmero de restries A B C D E F {a, {a, {a, {a, {a, {a, 0 v,r v,r v,r v,r v,r v,r } } } } } }

{a, {v, {v, {v, 1 v,r a r} r} r} } {v, {a, {r} {r} a r} r} {a, a r} {a, a r} {a, a r} a a

{v, r}

3 v

{r} {r}

4 v

{r}

5 v

6 v

Soluo

Tambm a escolha do valor para instanciar a varivel pode influenciar muito a busca da soluo. Uma heurstica escolher a menos restritiva, isto , o valor que minimiza a reduo dos domnios das outras variveis aps aplicao do forward-checking. As heursticas apresentadas acima para resoluo de problemas de satisfao de restries so gerais. En um problema especfico, podem existir outras heursticas para determinar a ordem de instanciao que dependem das caractersticas do problema. Outro exemplo: problema das 8 rainhas. O problema das oito rainhas consiste em colocar oito rainhas sobre um tabuleiro de xadrez de tal maneira que nenhuma rainha seja ameaada por outra. Para passar para o seguinte estado, a idia a seguinte: escolhemos uma das rainhas ameaadas e ns a deslocamos na mesma coluna, no lugar que est ameaado por o menor nmero de rainhas. Sem forward-checking:

Com forward-checking:

Com o forward-checking, assim que colocamos a quarta rainha, podemos ver que ser impossvel colocar uma rainha na sexta coluna. Portante, intil tentar colocar rainha nos dois lugares disponveis na quinta coluna e o algoritmo j sabe que ele tem que efetuar um backtrack.

Minimizaodeconflitos
Essa tcnica de resoluo uma combinao do Hill-Climbing com satisfao de restries. Do HillClimbing ela usa a idia de escolher o melhor estado sucessor. Das tcnicas de resoluo por satisfao de restries ela usa o princpio de representar o problema por um conjunto de variveis e restries sobre essas variveis. Um estado representado por uma instanciao completa das variveis. Como no HillClimbing, se o estado no o estado final (nesse caso, se existem restries violadas), identificamos o melhor estado sucessor. O que muda em relao ao Hill-Climbing original a maneira de identificar o estado sucessor. Primeiro, identificamos as variveis envolvidas em conflitos, isto , variveis cujo valor viola uma restrio. Para cada uma delas, consideramos os outros valores que pode receber. E para cada valor possvel calculamos o nmero de conflitos que ele causaria. Escolhemos a varivel e o valor que causam o menor nmero de conflitos. Um exemplo ajudar a esclarecer a tcnica.

Exemplo: Problema das oito rainhas: Para simplificar, utilizaremos o problema simplicado de quatro rainhas a colocar em um tabuleiro de 4x4. Cada coluna seria representada por uma varivel. Ento teramos quatro variveis A, B, C e D. O domnio de cada uma um valor de 1 a 4 para representar a linha onde se encontra a rainha. As restries seriam as seguintes: (1) A B (2) A C (3) A D (4) B C (5) B D (6) C D (7) A B + 1 (8) A B - 1 (9) A C + 2 (10) A C - 2 (11) A D + 3 (12) A D - 3 (13) B C + 1 (14) B C - 1 (15) B D + 2 (16) B D - 2 (17) C D + 1 (18) C D - 1 Suponha o seguinte estado inicial, onde A = B = C = D = 1:

Veja o nmero de conflitos para cada posio possvel:

Se colocarmos a rainha B na segunda linha, ela estaria envolvida em dois conflitos (as restries (8) e (13) acima seriam violadas). Se colocarmos uma das rainhas B ou C na ltima linha, nenhuma restrio ser violada. Portanto uma dessas possibilidades que ser escolhida. Supondo que a rainha B deslocada para a posio 4, obtemos a seguinte situao:

De novo temos duas possibilidades. Deslocando a rainha D na terceira linha, obtemos a seguinte configurao:

Finalmente, colocando a rainha A na segunda coluna, obtemos uma soluo:

Eis um exemplo do problema original de oito rainhas onde a soluo encontrada em duas etapas :

Note que em (1) tem duas rainhas ameaadas. Ento, tentamos deslocar uma delas. Escolhemos a ltima, porque na sua coluna tem duas posies que minimizam a ameaa. Deslocando a rainha na terceira casa de sua coluna, obtemos uma situao onde sobra somente uma rainha ameaada que podemos deslocar em uma casa segura, resolvendo assim o problema. Se tivssemos escolhido a outra casa com valor 1, demoraria mais para encontrar a soluo: dez etapas a mais, que ainda rasovel.

Limitesdastcnicasdebusca
As tcnicas de busca apresentadas aqui sofrem todas de alguns limites que podem torn-las inviveis:

Ambiente dinmico: se o ambiente no qual se encontra o agente dinmico, pode acontecer que a situao mudou enquanto ele estava construindo o seu plano. Nesse caso, pode acontecer que o plano no valha mais. Um ambiente pode se tornar dinmico pela presncia de efeitos externos (imagine por exemplo um agente confrontado a um ambiente sensvel s condies meterolgicas) ou outros agentes (futebol de rob por exemplo). Impreciso: A representao que o agente se faz sobre o mundo pode ser imprecisa. Supondo um agente que depende de uma cmera pada se fazer uma representao do mundo, pode acontecer que ele tenha informaes parciais. Por exemplo, ele pode ter dificuldade para deduzir o que escondido por obstculos na cena que ele est analisando. Se ele tem que se deslocar, a presena de um objeto no previsto pode atrapalhar a execuo do plano. Outra fonte de impreciso so os efeitos das aes. Se por exemplo o agente deve inserir um objeto em um buraco, usando um brao articulado, vai ser difcil ativar a mecnica do brao de maneira a respeitar exatamente os clculos que foram feitos para determinar o plano. Limite de tempo e de memria Os recursos de memria so limitados. Tambm em certas situaes, como por exemplo, sistemas de emergncia ou o futebol de rob, o agente tem um tempo limitado para efetuar a busca.

Para superar esses limites, existem solues. Eis alguamas:

Planejamento condicional: O agente produz um plano onde as aoes escolhidas dependem de condies. No momento da execuo, o agente consulta o ambiente para determinar quais condies so respeitadas, a fim de escolher a ao. Monitoramento: Enquanto executando o plano, o agente verifica se o ambiente mudou de maneira a impossibilitar o plano. Se for o caso, ele recomea a busca. Uma implementao simples dessa tcnica um agente que executa somente a primeira ao do seu plano. Depois ele analisa o

mundo e se a situaao mudou, ele recalcula o seu estado inicial (o estado onde ele se encontra agora, depois de ter executado o primeiro passo) e recomea o processo de busca. Assim por diante at chegar ao estado final. Busca aproximativa: Se no d para usar um algoritmo, como A*, que retorna uma soluo tima, podemos usar uma outra tcnica mais rpida, mas que pode retornar uma soluo no tima. Isso pode ser feito usando uma heurstica no adimissvel, ou terminando a busca antes de ter identificado o estado final. Eis exemplos de busca aproximativas: Busca em ilhas: Nessa tcnica, identificamos alguns estados n1...nk que devem fazer parte do caminho. Supondo n0 e nf os estados iniciais e finais, realizamos uma busca para determinar um plano para passar do estado n0 at o estado n1. Depois recomeamos para identificar um plano de n1 at n2, e assim por diante at nf. O plano final a concatenao desses sub-planos. O soma dos tempos para efetuar a busca em cada um desses subproblemas deveria ser menor que o tempo de busca para passar de n0 a nf. Como exemplo de aplicao, imagine algum que est na zona sul de uma cidade e quer se deslocar para a um lugar na zona norte. Ao invs de identificar um plano s, podemos buscar um caminho da origem para um lugar do centro da cidade, e depois do centro da cidade para o destino. Busca hierrquica: Nesse caso, existem macro-operadores que usamos em uma primeira busca para identificar as "grande etapas" do plano. Disso resulta um plano no muito detalhado. Recomeamos o processos para detalhar cada uma das etapas desse plano de alto nvel. Isse at achar um plano onde cada etapa uma ao que pode ser executada. Suponhamos por exemplo que o agente deve empurrar um mvel de um lugar para outro lugar. Ele pode fazer uma busca para identificar um plano de alto nvel: (1) Ir at o mvel, (2) Se posicionar para empurrar, (3) empurrar at o destino. Depois, cada uma dessas trs etapas refinada. Busca com horizonte limitado: O agente tem um limite de profundidade estabelecido. Se o limite for um limite de tempo, podemos transformar isso em limite de profundidade, estimando a profundidade que a busca no deve ultrapassar para respeitar o limite de tempo. Nesse caso, usamos uma funo de avaliao f(n) para cada estado n. Realizamos uma busca em profundidade, que memoriza o nodo que minimiza o valor f(n). Quando a busca efetua um backtrack, ela expandir somente os nodos que no tm um valor inferior ao valor mnimo memorizado. No final, a busca retorna o plano at o nodo que tem o menor valor f(n).

Exerccios 3.6 Eis um espao de estados, com indicao do custo para passar de um nodo ao seguinte. Queremos achar o caminho timo at o estado representado pelo nodo H. Suponhamos que h(n) retorna 2 para todo nodo, com a exceo do nodo H, que retornar 0.

Seja os trs seguintes algoritmos de busca:


Busca em profundidade Busca em largura Busca "melhor escolha", usando o algoritmo A.

a) Para cada um desses algoritmos, indique em que ordem so visitados os nodos at encontrar a soluo. b) Para cada um desses algoritmos, indique quais so os nodos que esto esperando quando ele visita o nodo H pela primeira vez. D a lista do nodos na ordem que eles seriam visitados se a busca continuar. c) A funo heurstica h(n) admissvel? (Justifique) d) A funo heurstica h(n) monotnica? (Justifique) 3.7 Imagine um rob aspirador que se encontra em uma sala quadrada dividida em quatro posies. A todo momento o rob ocupa um desses quadrados e tem uma das seguintes orientaes: norte, sul, leste, oeste. Em certos quadrados, pode ter sujeira. Existem trs aes que o rob pode realizar, todas com um custo de 10:

Avanar para a posio que est na sua frente. No estado resultante, o rob se encontra na posio que est na sua frente e aspira a sujeira, se tiver sujeira nessa nova posio. Efetuar uma rotao de 90 graus para a direita. Efetuar uma rotao de 90 graus para a esquerda.

O estado final atingido quando no existe nenhuma posio com sujeira. Suponhamos um estado inicial com sujeira nas posies (1,1) e (2,1), e o rob na posio (2,2) orientado na direo oeste:

a) Seja a seguinte heurstica admissvel: h1(n) = 10 x Ns, onde Ns o nmero de quadrados que contm sujeira. Mostre como est a rvore de busca no momento em que o algoritmo A* encontra a soluo e enumere os nodos na ordem em que eles foram visitados. Para cada nodo, indique tambm qual o seu valor f(n). b) Mostre que h1(n) admissvel. c) Proponha uma heurstica h2(n), admissvel, que domina h1(n). Mostre como est a rvore de busca no momento em que o algoritmo A* encontra a soluo e enumere os nodos na ordem em que eles foram visitados. Para cada nodo, indique tambm qual o seu valor f(n). d) Mostre, comparando as duas rvores de busca obtidas em a) e b), que h2(n) melhor que h1(n). 3.8 Suponha um problema que pode ser representado como um espao de 9 estados (designados pelas letras A at K). Considere o seguinte grafo, que representa os sucessores possveis para cada estado:

Os nodos representam os estados e as arestas o custo para passar de um estado a outro estado. A direo da flecha indica o estado resultante. Por exemplo, possvel atingir o estado A a partir do estado G com um custo de 10. Suponha agora que G o estado inicial e K o estado final. Mostre a a seqncia dos nodos visitados (ordem de visita) e os nodos que esto esperando para ser visitados no momento em que se encontra uma soluo, em cada uma das seguintes buscas:

a) Busca em largura. b) Busca em profundidade. c) Busca com o algoritmo A*, utilizando a seguinte funo heurstica: h(A) = h(C) = h(E) = h(F) = h(G) = 10, h(B) = 20, h(D) = 5 e h(H) = h(K) = 0. Para cada nodo da rvore, indique o seu valor f(n). d) Dessas trs buscas, qual a melhor para esse problema especfico? Justifique. 3.9 Suponha um problema que pode ser representado como um espao de 7 estados, designados pelas letras A at G, onde A o estado inicial e F o estado final. Considere o seguintes espaos de estados:

Os nodos representam os estados e as arestas o custo para passar de um estado a outro estado. A cada estado est indicado entre parnteses uma estimativa do custo deste estado at o estado final. Suponha que voc possa escolher entre os seguintes algoritmos de busca: busca em profundidade, busca em largura, A* e Hill-Climbing. Para cada um dos trs espaos de estados, indique qual algoritmo ser o melhor, considerando que queremos uma soluo tima o mais rpido possvel. Justifique as suas respostas e mostre qual ser a ordem dos nodos visitados com o mtodo escolhido. 3.10 Eu quero pagar a minha passagem de nibus, que custa 90 centavos. Para pag-la, eu quero utilizar ao menos 5 moedas. O cobrador quer que eu lhe d uma moeda de 25 centavos ou duas de 10 centavos. Represente isso como um problema de satisfao de restries e mostre como as heursticas de forwardchecking, varivel mais restrita e/ou varivel mais restringente agilizam a resoluo. Para resolver o problema, fixe o nmero de moedas de 1, 5, 10, 25 e 50 centavos que eu tenho. 3.11 Resolva o problema de colorao acima usando a tcnica de minimizao de conflitos. Comece com os seguintes valores iniciais: A = D = azul, B = E = vermelho e C = F = roxo. 3.12 Considere o seguinte quebra-cabea constitudo de 3 peas brancas de um lado, 3 peas pretas do outro lado, e uma posio vazia:

O objetivo inverter a ordem das peas, isto , ter todas as peas brancas do lado esquerda e as pretas direita. E isso ao menor custo possvel. Para obter esse estado existem trs movimentos possveis: 1. Deslizar uma pea no lugar vazio se ele contguo a essa pea (custo = 1). 2. Uma pea pode pular encima de outra pea para alcanar o lugar vazio (custo = 1). 3. Uma pea pode pular encima de duas outras peas para alcanar o lugar vazio (custo = 2). Proponha uma heurstica admissvel para resolver esse problema com A*.

Você também pode gostar