Exemple #1
0
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
Exemple #2
0
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
Exemple #3
0
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
Exemple #4
0
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
Exemple #5
0
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
Exemple #6
0
def DLS(problema, limite):
    no = No(problema.inicio)
    return DLSrecursiva(no, problema, limite)