-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathbuscas-cegas.py
71 lines (52 loc) · 2.1 KB
/
buscas-cegas.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
import no_de_busca
def busca_amplitude(inicial):
return _busca_cega_generica(inicial, lambda q, e: q.insert(0, e))
def busca_profundidade(inicial):
return _busca_cega_generica(inicial, lambda q, e: q.append(e))
def _busca_cega_generica(inicial, enfileirar):
borda = [ no_de_busca.construir_no_raiz(inicial) ]
visitados = set()
while borda:
folha = borda.pop()
if folha.estado.isObjetivo():
return folha
visitados.add(folha.estado)
for acao in folha.estado.acoesPossiveis():
expandido = no_de_busca.construir_no_filho(folha, acao)
if expandido.estado not in visitados:
enfileirar(borda, expandido)
raise None
# Implementação simplificada, recursiva, do professor.
def busca_com_retrocesso(inicial):
visitados = set()
def busca_com_retrocesso_rec(atual):
if atual.isObjetivo():
return []
filhos_de_atual = (filho for filho in estado_atual.adjacentes() if filho not in visitados)
for filho in filhos_de_atual:
solucao = busca_com_retrocesso_rec(filho)
if solucao != None:
return [filho] + solucao
else:
visitados.add(filho)
return None
return busca_com_retrocesso_rec(inicial)
# Implementação fiel ao livro, mas com nomes melhorados.
def busca_com_retrocesso_estruturada(inicial):
caminho, borda, becos, estado_atual = [inicial], [inicial], [], inicial
while borda:
if estado_atual.isObjetivo():
return caminho
filhos_ec = [filho for filho in estado_atual.adjacentes() if filho not in becos]
if not filhos_ec:
while caminho and estado_atual == caminho[0]:
becos.append(estado_atual)
caminho.pop(0)
borda.pop(0)
estado_atual = borda[0]
caminho.append(estado_atual)
else:
borda = filhos_ec + borda
estado_atual = borda[0]
caminho.insert(0, estado_atual)
return None