Procura cega
-
Upload
octavio-oli -
Category
Documents
-
view
3 -
download
0
description
Transcript of Procura cega
1
Descrição do trabalho efetuado para resolver o e-fólio A
A matéria do e-fólio A é a Procura cega.
Existem dois métodos 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 relação à anterior, temos apenas de fazer
variar o limite do aprofundamento entre 0 e infinito.
Sendo os Algoritmos:
Função ProcuraLarguraPrimeiro (problema, InsereFila): solução ou falha
I_nós ← Fazfila ( EstadoInicial(problema) )
Repete
Se FilaVazia(I_nós) Então
Devolve falha
Fim_de_Se
nó ← RetiraFila(I_nós)
Se TesteObjectivo(nó) Então
Devolve nó
Senão
InsererFila(I_nós, Expansão(nó, Operadores(problema)))
Fim_de_Se
Fim_de_Repete
Fim_de_Função
Função ProcuraProfundidadePrimeiro (problema, InserePilha): solução ou falha
I_nós ← FazPilha ( EstadoInicial(problema) )
Repete
Se PilhaVazia(I_nós) Então
Devolve falha
Fim_de_Se
nó ← RetiraPilha(I_nós)
Se TesteObjectivo(nó) Então
Devolve nó
Senão
InsererPilha(I_nós, Expansão(nó, Operadores(problema)))
Fim_de_Se
Fim_de_Repete
Fim_de_Função
2
Verifica-se que ambos retornam (solução ou falha), i.e., uma variável booleana (true ou false). A
única diferença que se nota entre eles é a utilização de uma fila ou de uma pilha.
Sendo assim, só temos que saber qual é a diferença entre fila e pilha.
A fila baseia-se no método FIFO-First In First Out. A pilha baseia-se no método LIFO- Last In First Out.
Com se faz a procura de uma solução (GOAL) de um problema?
1. O problema tem diversos estados e a solução é um desses estados.
2. Para resolver um problema, construímos uma estrutura em árvore e associamos a essa
estrutura os estados possíveis do problema, apenas para facilitar a procura.
Árvore Estados do problema
Associação: 0:E0, 1:E1, 2:E2, etc.
Para compreender e fixar melhor a matéria dada, resolvi melhorar o programa apresentado no e-
fólio A de forma a integrar a parte mais significativa da matéria.
Para resolver o sokoban, o programa (problema do e-fólio A) tem uma classe com o nome
Tfila_pilha, é esta classe que tem implementada a diferença existente entre fila e pilha.
Inicialmente o programa executa o procedimento genérico de procura, quer em BFS ou DFS, que é
expandir o nó 0 para dar origem aos 4 novos nós, correspondentes aos 4 estados possíveis, definidos
na resolução do puzzle sokoban (movimento da peça @ 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 são construídas com arrays onde se insere elementos na última posição dos
arrays. A única diferença está na obtenção 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 sequência efetuada no programa é a seguinte (neste exemplo considerou-se que expande apenas
os nós apresentados na figura seguinte):
01
11
21
31
41
51
E0
E1
E2
71
61
E3 E4
E5 E6
E7
3
Procura em Largura Primeiro (BFS – Breadth First Search)
Árvore Estados do problema
Sequência Fila Sai da Fila Expansão
1º [0] 0 1, 2
2º [1, 2] 1 3, 4
3º [2, 3, 4] 2 5, 6, 7
4º [3, 4, 5, 6, 7] 3 Etc.
Procura em Profundidade Primeiro (DFS – Depth-First Search)
Árvore Estados do problema
Sequência Pilha Sai da Pilha Expansão
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 relação à fila, aqui apenas se trocou a posição do nó 1 pelo 2, do 4 pelo 3, etc., não
interessa nada trata-se apenas de uma questão de atribuição 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 são praticamente iguais, por
isso tem apenas um, a diferença faz-se na classe Tfila_pilha.
01
11
21
31
41
51
E0
E1
E2
71
61
E3 E4
E5 E6
E7
Ordem
01
21
11
4 3
E0
E2
E4
E3
E1
E5 E6
E7 7 6 5
O
r
d
e
m
4
Para resolver o puzzle sokoban tem a classe Tnode_problem que serve para guardar os estados do
problema, associados aos nós (é um contentor). Tem a classe Tprolem que resolve o movimento das
peças, as expansões, e elemina os estados repetidos.