def DFS(problema): no = No(problema.inicio) if problema.test_objetivo(no.estado): return [no.estado] borda = [no] while borda: no = borda.pop(-1) for acao in problema.acoes(no.estado): filho = No(acao, no) if filho not in borda: if problema.test_objetivo(filho.estado): return solucao(filho) borda.append(filho) return None
def BFS(problema): no = No(problema.inicio) if problema.test_objetivo(no.estado): return [no.estado] borda = [no] explorado = set() while borda: no = borda.pop(0) explorado.add(no.estado) for acao in problema.acoes(no.estado): filho = No(acao, no) if filho not in borda and filho.estado not in explorado: if problema.test_objetivo(filho.estado): return solucao(filho) borda.append(filho) return None
def BS(problema): no1, final = No(problema.inicio), No(problema.objetivo) if problema.test_objetivo(no1.estado): return [no1.estado] borda1, borda2 = [], [] explorado1, explorado2 = set(), set() borda1.append(no1) borda2.append(final) explorado1.add(no1.estado) explorado2.add(final.estado) while borda1 and borda2: no1, no2 = borda1.pop(0), borda2.pop(0) aux = verificarBordas(no1, borda2) if aux: no2 = trocarPais(aux) no2.pais = no1.pais return solucao(final) explorado1.add(no1.estado) explorado2.add(no2.estado) for acao in problema.acao[no1.estado]: filho = No(acao, no1) if filho not in borda1 and filho.estado not in explorado1: borda1.append(filho) print("Borda 1:") print([i.estado for i in borda1]) for acao in problema.acoes(no2.estado): filho = No(acao, no2) if filho not in borda2 and filho.estado not in explorado2: borda2.append(filho) print("Borda 2:") print([i.estado for i in borda2]) print("") return None
def UCS(problema): no = No(problema.inicio) borda = PriorityQueue() borda.put((no.custo_caminho, no)) explorado = set() while borda: aux = borda.get() no = aux[1] if problema.test_objetivo(no.estado): return solucao(no) explorado.add(no.estado) for acao in problema.acoes(no.estado): caminho_custo = int( problema.acao[acao][no.estado]) + no.custo_caminho filho = No(acao, no, custo_caminho=caminho_custo) it = [i for i in borda.queue] if (filho.custo_caminho, filho) not in it and filho.estado not in explorado: borda.put((filho.custo_caminho, filho)) return None
def DLSrecursiva(no, problema, limite): if problema.test_objetivo(no.estado): return solucao(no) elif limite == 0: return "termino" else: termino_ocorreu = False for acao in problema.acoes(no.estado): filho = No(acao, no) resultado = DLSrecursiva(filho, problema, limite - 1) if resultado == "termino": termino_ocorreu = True elif resultado: return resultado if termino_ocorreu: return "termino" else: return False
def DLS(problema, limite): no = No(problema.inicio) return DLSrecursiva(no, problema, limite)