Escolar Documentos
Profissional Documentos
Cultura Documentos
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
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.
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.