Sei sulla pagina 1di 4

Descrio do trabalho efetuado para resolver o e-flio A

A matria do e-flio A a Procura cega.


Existem dois mtodos de procura cega:

Procura em Largura Primeiro (BFS Breadth First Search)


A Procura de Custo Uniforme (UCS uniform-cost search) igual, s que expande primeiro o
n com menor custo.
Procura em Profundidade Primeiro (DFS Depth-First Search)
A Procura em Profundidade Limitada (DLS Depth-Limited Search) igual, apenas limita a
profundidade da procura.
A Procura em Profundidade Iterativa ou Aprofundamento Progressivo (IDDFS Iterative
Deepening Depth-First Search) uma melhoria em relao anterior, temos apenas de fazer
variar o limite do aprofundamento entre 0 e infinito.

Sendo os Algoritmos:
Funo ProcuraLarguraPrimeiro (problema, InsereFila): soluo ou falha
I_ns Fazfila ( EstadoInicial(problema) )
Repete
Se FilaVazia(I_ns) Ento
Devolve falha
Fim_de_Se
n RetiraFila(I_ns)
Se TesteObjectivo(n) Ento
Devolve n
Seno
InsererFila(I_ns, Expanso(n, Operadores(problema)))
Fim_de_Se
Fim_de_Repete
Fim_de_Funo
Funo ProcuraProfundidadePrimeiro (problema, InserePilha): soluo ou falha
I_ns FazPilha ( EstadoInicial(problema) )
Repete
Se PilhaVazia(I_ns) Ento
Devolve falha
Fim_de_Se
n RetiraPilha(I_ns)
Se TesteObjectivo(n) Ento
Devolve n
Seno
InsererPilha(I_ns, Expanso(n, Operadores(problema)))
Fim_de_Se
Fim_de_Repete
Fim_de_Funo
1

Verifica-se que ambos retornam (soluo ou falha), i.e., uma varivel booleana (true ou false). A
nica diferena que se nota entre eles a utilizao de uma fila ou de uma pilha.
Sendo assim, s temos que saber qual a diferena entre fila e pilha.
A fila baseia-se no mtodo FIFO-First In First Out. A pilha baseia-se no mtodo LIFO- Last In First Out.
Com se faz a procura de uma soluo (GOAL) de um problema?
1. O problema tem diversos estados e a soluo um desses estados.
2. Para resolver um problema, construmos uma estrutura em rvore e associamos a essa
estrutura os estados possveis do problema, apenas para facilitar a procura.

rvore

Estados do problema
E0

0
1

E1

E4

2
1

1
1

E2
3
1

E3

4
1

5
1

6
1

E5

7
1

E6

E7

Associao: 0:E0, 1:E1, 2:E2, etc.


Para compreender e fixar melhor a matria dada, resolvi melhorar o programa apresentado no eflio A de forma a integrar a parte mais significativa da matria.
Para resolver o sokoban, o programa (problema do e-flio A) tem uma classe com o nome
Tfila_pilha, esta classe que tem implementada a diferena existente entre fila e pilha.
Inicialmente o programa executa o procedimento genrico de procura, quer em BFS ou DFS, que
expandir o n 0 para dar origem aos 4 novos ns, correspondentes aos 4 estados possveis, definidos
na resoluo do puzzle sokoban (movimento da pea @ para N-Norte, S-Sul, E-Este e W-Oeste).
Depois vai usar a fila ou pilha, conforme faz procura BFS ou DFS.
Tanto a fila como a pilha so construdas com arrays onde se insere elementos na ltima posio dos
arrays. A nica diferena est na obteno do elemento que se retira do array, correspondente ao
n que se deseja expandir. Na fila o primeiro, na pilha o ultimo (normalmente retira-se o topo da
pilha).
A sequncia efetuada no programa a seguinte (neste exemplo considerou-se que expande apenas
os ns apresentados na figura seguinte):

Procura em Largura Primeiro (BFS Breadth First Search)


rvore
Estados do problema
E0

0
1

E1

Ordem

2
1

1
1
4
1

Sequncia
1
2
3
4

6
1

5
1

Fila
[0]
[1, 2]
[2, 3, 4]
[3, 4, 5, 6, 7]

Sai da Fila
0
1
2
3

E4

E5

E2
3
1

E3

7
1

E6

E7

Expanso
1, 2
3, 4
5, 6, 7
Etc.

Procura em Profundidade Primeiro (DFS Depth-First Search)


rvore
Estados do problema
O
r
d
e
m

0
1

E1

E2

E3

E4

E5

1
1

2
1

E6

E0

E7

Sequncia Pilha
Sai da Pilha
Expanso
1
[0]
0
1, 2
2
[1, 2]
2
3, 4
3
[1, 3, 4]
4
5, 6, 7
4
[1, 3, 5, 6,7]
7
Etc.
Nota: Em relao fila, aqui apenas se trocou a posio do n 1 pelo 2, do 4 pelo 3, etc., no
interessa nada trata-se apenas de uma questo de atribuio de ndice.

Para a implementar a estrutura em rvore, o programa tem a classe Tprocura com o algoritmo de
procura para BFS/DFS e a classe Tfila_pilha. Os algoritmos BFS e DFS so praticamente iguais, por
isso tem apenas um, a diferena faz-se na classe Tfila_pilha.

Para resolver o puzzle sokoban tem a classe Tnode_problem que serve para guardar os estados do
problema, associados aos ns ( um contentor). Tem a classe Tprolem que resolve o movimento das
peas, as expanses, e elemina os estados repetidos.

Potrebbero piacerti anche