Você está na página 1de 9

Estratgias Bsicas de Resoluo de Problemas

Um espao de estados um grafo cujos ns correspondem a situaes do problema. Um dado problema reduzido busca de um caminho no grafo o representa.

Considere o exemplo da Figura 1, que apresenta a representao grfica do problema de manipulao de blocos. O problema o de encontrar um plano para rearranjar uma pilha de blocos como mostrado naquela figura. Especificao:

1. apenas 1 bloco pode ser movimentado de cada vez 2. apenas blocos do topo das pilhas podem ser pegos 3. um bloco pode ser colocado sobre a mesa ou sobre algum outro bloco

Para encontrar um certo plano, devemos descobrir a sequncia de movimentos que resultam naquele plano. Podemos pensar nesse problema como um problema de explorao entre todas as possveis alternativas. A partir da situao inicial do problema, existe apenas uma nica alternativa: colocar o bloco C sobre a mesa. Aps C ter sido colocado sobre a mesa, temos trs alternativas possveis: 1) colocar A sobre a mesa ou 2) colocar A sobre C ou 3) colocar C sobre A.

c a b

a b c

Figura 1 - O mundo dos blocos

c a b

b a c

a bc

a bc

c b a

b ac

abc

c ab

b c a

b a c

c ab

a b c

a c b

Neste tipo de problema, existem dois tipos de conceitos:

1. situaes do problema 2. movimentos ou aes legais, que transformam situaes do problema em outras situaes.

Situaes do problema e possveis movimentos formam um grafo direcionado chamado de espao de estados. A figura anterior representa o espao de estados do problema do mundo dos blocos. Os ns do grafo correspondem a situaes do problema e os arcos correspondem a transies legais entre estados. O problema de encontrar um plano de soluo equivalente a encontrar um caminho entre a dada situao inicial (n inicial) e alguma situao final especfica, chamada de n meta (goal)
2

1 8 7

3 2 6

?
4 5

1 8 7

2 6

3 4 5

1 8 7

3 2 6

4 5

1 8 7

3 2 4 6 5

1 8 7

3 4 2 6 5

8 7

1 3 2 4 6 5

1 8 7

2 3 4 6 5

1 8 7

3 4 2 5 6

1 8 7

3 6

4 2 5

Outros problemas que seguem esse modelo: torres de Hanoi, atravessar o rio com raposa, ganso e gros, caixeiro viajante, etc.

Sumarizando: O espao de estados de um dado problema especifica as regras do jogo: ns no espao de estado correspondem a situaes e arcos correspondem a movimentos permitidos, ou aes, ou ainda, passos da soluo. Um problema particular definido por: 1. espao de estados 2. n inicial 3. condio goal (uma condio a ser alcanada); ns goals so aqueles ns que satisfazem essa condio.

Custos podem ser associados aos movimentos permitidos. Por exemplo, o custo associado movimentao de blocos pode
3

indicar que alguns blocos so mais difceis de serem movidos que outros. No problema do caixeiro viajante, geralmente os custos dos movimentos so as distncias entre as cidades. Nos casos em que custos esto associados aos movimentos, normalmente estamos interessados em solues de custo mnimo.

O espao de estados em um programa Prolog pode ser representado pela relao: s(X,Y) que verdade se existe um movimento permitido no espao de estados de um n X para um n Y. O n Y o sucessor de X. Se existe um custo associado com movimentos, ento um terceiro argumento adicionado: s(X,Y,Custo) Em um programa esta relao pode ser explicitamente representada por um conjunto de fatos. Entretanto essa representao explcita normalmente invivel devido complexidade dos espaos de estado. Portanto, a relao sucessor, s, usualmente definida implicitamente atravs do estabelecimento das regras que determinam os ns sucessores de um dado n. Uma outra considerao importante a de como representar as situaes do problema, isto , como representar os ns. A representao, alm de compacta, deve permitir a execuo eficiente das operaes requeridas; particularmente, a avaliao da relao sucessor e quando for o caso, os custos associados.

Consideremos novamente o problema dos blocos, numa situao mais geral, onde existe um nmero qualquer de blcos arrumados em uma ou mais pilhas. O nmero de pilhas deve ser limitado a algum nmero mximo, de maneira a tornar o problema mais interessante. Isso pode ser uma restrio realstica porque um rob que manipula blocos pode ter um espao limitado para trabalhar, sobre uma mesa.

A situao do problema pode ser representada como uma lista de pilhas, com cada pilha, por sua vez, representada como uma lista de blocos, onde o bloco que ocupa o topo da pilha a cabea da lista que representa a pilha. Pilhas vazias so representadas por listas vazias. A situao inicial do problema anterior pode ser ento representada como: [[c,a,b],[ ],[ ]] Uma situao goal pode ser representada por qualquer das configaraes:

[[a,b,c],[ ],[ ]] [[ ],[a,b,c],[ ]] [[ ],[ ],[a,b,c]]

A relao sucessor pode ser programada de acordo com a seguinte regra: Situation2 um sucessor de Situation1 se existirem duas pilhas, Stack1 e Stack2, em Situation1, e o bloco do topo de Stack1 pode ser movido para Stack2. Como todas as situaes so representadas como listas de pilhas, isso pode ser escrito em Prolog como:

s(Stacks,[Stack1,[Top1|Stack2]| OtherStacks]):del([Top1|Stack1],Stacks,Stacks1), del(Stack2,Stacks1,OtherStacks). del(X,[X|L],L). del(X,[Y|L],[Y|L1]):del(X,L,L1).

A condio-goal do problema : goal(Situation):- pertence([a,b,c],Situation).

O programa de busca ser implementado como a relao:

solve(Start,Solution)

onde Start o n inicial do espao de estados e Solution o caminho entre Start e qualquer n goal. Para o problema de manipulao dos blocos, a interrogao correspondente seria: ?- solve([[c,a,b],[ ],[ ]],Solution). Como resultado de uma busca bem sucedida, Solution instanciada com uma lista de arranjos de blocos. Esta lista representa um plano para a transformao do estado inicial em um estado no qual os trs blocos esto em uma pilha com a configurao: [a,b,c].

Estratgia de Busca em Profundidade (Depth-first) Dada a formulao de um problema como um espao de estados, existem muitas abordagens para encontrar o caminho-soluo. Uma delas a busca em profundidade. Para encontrar o caminho-soluo, Sol, de um dado n N a algum n goal: se N um n goal, ento Sol = [N], ou se existe um n sucessor, N1, de N, tal que existe um caminho Sol1 de N1 ao n goal, ento Sol = [N|Sol1] Isso se traduz em Prolog como: solve(N,[N]):- goal(N). solve(N,[N|Sol1]):- s(N,N1),solve(N1,Sol1). Sempre que for dada ao algoritmo depth-first a escolha de continuar a busca por intermdio de vrios ns, ele sempre

escolhe o de maior profundidade. O de maior profundidade o que est mais longe do n inicial.

a b d h i e j f k c g

Essa figura mostra um espao de estados bem simples: o n inicial a e f e g so ns goals. A ordem na qual a estratgia depth-first visita os ns nesse espao de estados : a,b,d,h,e,I,j. A soluo encontrada : [a,b,e,j]. No backtracking, a outra soluo descoberta: [a,c,f]. Essa ordem corresponde maneira como o Prolog responde interrogao: ?- solve(a,Sol). A estratgia depth-first frequentemente funciona bem; entretanto existem situaes nas quais o procedimento solve, como definido acima, dependendo do espao de estados, pode dar problemas. Suponha, por exemplo, que o espao de estados anterior seja modificado, com a introduo de um arco que liga h a d, formando assim, um ciclo.

b d h e

Um mecanismo de deteco de ciclos pode ser adicionado ao programa depth-first: qualquer n que j faa parte do caminho a partir do n inicial ao n atual, no deve ser considerado novamente. Isso pode ser formulado como a relao:

depthfirst(Path, Node, Solution) Como ilustrado na prxima figura, Node o estado a partir do qual um caminho ao estado goal deve ser encontrado; Path um caminho (lista de ns) entre o n inicial e Node; Solution o Path estendido via Node, ao n goal.
n inicial

Path N

Solution

n goal

solve(Node,Solution):depthfirst([ ],Node,Solution). depthfirst(Path,Node,[Node|Path]):goal(Node). depthfirst(Path,Node,Sol):s(Node,Node1), not pertence(Node1,Path), depthfirst([Node|Path],Node1,Sol).

importante comentar que em muitos dos espaos de estados o programa vai se perder devido a tais espaos serem infinitos. Em tais espaos, o algoritmo depth-first pode seguir um ramo infinito do grafo de busca; o programa ir explorar essa parte infinita do espao, nunca chegando prximo do goal. Para evitar isso, um outro refinamento pode ser adicionado ao procedimento bsico de busca depth-first: limitar a profundidade da busca; a busca, por exemplo, pode ser limitada a uma profundidade mxima determinada por Maxdepth.

depthfirst2(Node,[Node],_):- goal(Node). depthfirst2(Node,[Node|Sol],Masdepth):Maxdepth > 0, s(Node,Node1), Max1 is Masdepth 1, depthfirst2(Node1,Sol,Max1).

Exerccios: 1) Escreva um procedimento de busda depth-first (com deteco de ciclos): depthfirst1(CandidatePath,Solution), para encontrar o caminho soluo Solution como uma extenso de CandidatePath. Ambos caminhos devem ser representados como listas de ns na ordem inversa, de maneira que o n goal a cabea de Solution. 2) Escreva um procedimento de busca depth-first que combina os mecanismos de deteco de ciclos e limitao de profundidade.