Пример #1
0
def depth_first_search(mapa, inicio, fim):
    aberto = []
    fechado = []
    no_inicio = No.No(inicio, None)
    no_objetivo = No.No(fim, None)

    aberto.append(no_inicio)
    while len(aberto) > 0:
        no_atual = aberto.pop(-1)
        fechado.append(no_atual)
        if no_atual == no_objetivo:
            path = []
            while no_atual != no_inicio:
                path.append(no_atual.posicao)
                no_atual = no_atual.pai
            return path[::-1]

        (x, y) = no_atual.posicao
        vizinhos = [(x - 1, y), (x + 1, y), (x, y - 1), (x, y + 1)]
        for proximo in vizinhos:
            valor_mapa = mapa.get(proximo)
            if ((valor_mapa == '#') or (valor_mapa == '&')
                    or (valor_mapa == ' ')):
                continue

            vizinhos = No.No(proximo, no_atual)
            if (vizinhos in fechado):
                continue
            if (vizinhos not in aberto):
                aberto.append(vizinhos)
    return None
Пример #2
0
def best_first_search(mapa, inicio, fim):
    aberto = []
    fechado = []

    no_inicio = No.No(inicio, None)
    objetivo = No.No(fim, None)

    aberto.append(no_inicio)

    while len(aberto) > 0:
        aberto.sort()

        no_atual = aberto.pop(0)

        fechado.append(no_atual)

        if no_atual == objetivo:
            path = []
            while no_atual != no_inicio:
                path.append(no_atual.posicao)
                no_atual = no_atual.pai
            return path[::-1]

        (x, y) = no_atual.posicao

        vizinhos = [(x - 1, y), (x + 1, y), (x, y - 1), (x, y + 1)]

        for proximo in vizinhos:
            valor = mapa.get(proximo)
            if (valor == '#'):
                continue
            if (valor == '&'):
                continue
            if (valor == ' '):
                continue

            vizinho = No.No(proximo, no_atual)

            if (vizinho in fechado):
                continue
            vizinho.g = abs(vizinho.posicao[0] -
                            no_inicio.posicao[0]) + abs(vizinho.posicao[1] -
                                                        no_inicio.posicao[1])
            vizinho.h = abs(vizinho.posicao[0] -
                            objetivo.posicao[0]) + abs(vizinho.posicao[1] -
                                                       objetivo.posicao[1])
            vizinho.f = vizinho.h

            for no in aberto:
                if (vizinho == no and vizinho.f > no.f):
                    continue

            aberto.append(vizinho)

    return None
Пример #3
0
def simulated_annealing(mapa, inicio, fim, T0=1000, N=15, alpha=0.999, k=1):
    inicio_no = No.No(inicio, None)
    objetivo_no = No.No(fim, None)
    path = []
    no_atual = inicio_no
    (x, y) = no_atual.posicao
    (goal_x, goal_y) = objetivo_no.posicao
    path.append(no_atual.posicao)
    while T0 > 2:
        for j in range(N):
            rand_amp = np.random.rand()
            choose_x_y = np.random.rand()
            step_x = 0
            step_y = 0
            if choose_x_y >= 0.5:
                step_x = k * (1 if rand_amp < 0.5 else -1)
            else:
                step_y = -k * (1 if rand_amp < 0.5 else -1)

            x_temporary = x + step_x
            y_temporary = y + step_y

            obj_mov_possible = (x_temporary - goal_x) ** 2 + (y_temporary - goal_y) ** 2

            obj_val_current = (x_temporary - x) ** 2 + (y_temporary - y) ** 2

            rand_factor = np.random.rand()

            probality_eq = 1 / (np.exp((obj_mov_possible - obj_val_current) / T0))

            content = mapa.get((x_temporary, y_temporary))
            if ((content == '#') or (content == '&') or (content == ' ')):
                continue

            if (obj_mov_possible <= obj_val_current) | (rand_factor <= probality_eq):
                no_atual = No.No((x, y), (x_temporary, y_temporary))
                x = x_temporary
                y = y_temporary
                path.append(no_atual.posicao)
            else:
                if (obj_mov_possible <= obj_val_current) | (rand_factor <= probality_eq):
                    no_atual = No.No((x, y), (x_temporary, y_temporary))
                    x = x_temporary
                    y = y_temporary
                    path.append(no_atual.posicao)
                else:
                    x = x
                    y = y

            if no_atual == objetivo_no:
                return path[::-1]

            T0 = alpha * T0
    return None
Пример #4
0
def depth_first_search(mapa, inicio, fim):
    # Criar listas para nós abertos e nós fechados
    aberto = []
    fechado = []

    # Crie um nó representando o inicio e o objetivo
    no_inicio = No.No(inicio, None)
    no_objetivo = No.No(fim, None)
    # Adiciona nó inicial
    aberto.append(no_inicio)

    # Repetir até que a lista aberta esteja vazia
    while len(aberto) > 0:
        # Obtenha o último nó (LIFO)
        no_atual = aberto.pop(-1)
        # Adicione o nó atual à lista fechada
        fechado.append(no_atual)
        # Verifique se atingimos a meta, retorne o caminho
        if no_atual == no_objetivo:
            path = []
            while no_atual != no_inicio:
                path.append(no_atual.posicao)
                no_atual = no_atual.pai
                # Retornar caminho invertido
            return path[::-1]

        # Pega a posição atual do nó
        (x, y) = no_atual.posicao
        # Pega os vizinhos
        vizinhos = [(x - 1, y), (x + 1, y), (x, y - 1), (x, y + 1)]
        # Loop nos vizinhos
        for proximo in vizinhos:
            # Pega valor do mapa
            valor_mapa = mapa.get(proximo)
            # Verifique se é uma parede, fantasma ou obstáculo
            if ((valor_mapa == '#') or (valor_mapa == '&')
                    or (valor_mapa == ' ')):
                continue

            # Crie o nó vizinho
            vizinhos = No.No(proximo, no_atual)
            # Checa se o vizinho está em fechado
            if (vizinhos in fechado):
                continue
            # Adicione o nó se não estiver aberto
            if (vizinhos not in aberto):
                aberto.append(vizinhos)
    # Retorne vazio, não há caminho
    return None
Пример #5
0
def breadth_first_search(mapa, inicio, fim):
    # Criar listas para nós abertos e nós fechados
    aberto = []
    fechado = []
    # Crie um nó representando o inicio e o objetivo
    inicio_node = No.No(inicio, None)
    objetivo = No.No(fim, None)
    # Adiciona nó inicial
    aberto.append(inicio_node)

    # Repetir até que a lista aberta esteja vazia
    while len(aberto) > 0:
        # Pegue o primeiro nó (FIFO)
        no_atual = aberto.pop(0)
        # Adicione o nó atual à lista fechada
        fechado.append(no_atual)
        # Verifique se atingimos a meta, retorne o caminho
        if no_atual == objetivo:
            caminho = []
            while no_atual != inicio_node:
                caminho.append(no_atual.posicao)
                no_atual = no_atual.pai
                # Retornar caminho invertido
            return caminho[::-1]
        # Pega a posição atual do nó
        (x, y) = no_atual.posicao
        # Pega os vizinhos
        vizinhos = [(x - 1, y), (x + 1, y), (x, y - 1), (x, y + 1)]

        # Loop nos vizinhos
        for proximo in vizinhos:
            # Pega valor do mapa
            valor = mapa.get(proximo)
            # Verifique se é uma parede, fantasma ou obstáculo
            if (valor == '#') or (valor == '&') or (valor == ' '):
                continue
            # Crie o nó vizinho
            vizinho = No.No(proximo, no_atual)
            # Checa se o vizinho está em fechado
            if (vizinho in fechado):
                continue
            # Adicione o nó se não estiver aberto
            if (vizinho not in aberto):
                aberto.append(vizinho)

    return None
Пример #6
0
def aestrela(mapa, inicio, fim):
    aberto = []
    fechado = []

    inicio_no = No.No(inicio, None)
    objetivo_no = No.No(fim, None)

    aberto.append(inicio_no)

    while len(aberto) > 0:
        aberto.sort()
        no_atual = aberto.pop(0)
        fechado.append(no_atual)
        if no_atual == objetivo_no:
            path = []
            while no_atual != inicio_no:
                path.append(no_atual.posicao)
                no_atual = no_atual.pai
            return path[::-1]

        (x, y) = no_atual.posicao
        vizinhos = [(x - 1, y), (x + 1, y), (x, y - 1), (x, y + 1)]

        for prox in vizinhos:
            mapa_valor = mapa.get(prox)
            if ((mapa_valor == '#') or (mapa_valor == '&')):
                continue
            vizinho = No.No(prox, no_atual)

            if (vizinho in fechado):
                continue
            vizinho.g = abs(vizinho.posicao[0] -
                            inicio_no.posicao[0]) + abs(vizinho.posicao[1] -
                                                        inicio_no.posicao[1])
            vizinho.h = abs(vizinho.posicao[0] - objetivo_no.posicao[0]) + abs(
                vizinho.posicao[1] - objetivo_no.posicao[1])
            vizinho.f = vizinho.g + vizinho.h
            for no in aberto:
                if (vizinho == no and vizinho.f > no.f):
                    continue
            aberto.append(vizinho)

    return None
Пример #7
0
def breadth_first_search(mapa, inicio, fim):
    aberto = []
    fechado = []

    inicio_node = No.No(inicio, None)
    objetivo = No.No(fim, None)

    aberto.append(inicio_node)

    while len(aberto) > 0:

        no_atual = aberto.pop(0)
        fechado.append(no_atual)

        if no_atual == objetivo:
            caminho = []
            while no_atual != inicio_node:
                caminho.append(no_atual.posicao)
                no_atual = no_atual.pai
            return caminho[::-1]

        (x, y) = no_atual.posicao

        vizinhos = [(x - 1, y), (x + 1, y), (x, y - 1), (x, y + 1)]

        for proximo in vizinhos:

            valor = mapa.get(proximo)

            if (valor == '#') or (valor == '&') or (valor == ' '):
                continue

            vizinho = No.No(proximo, no_atual)

            if (vizinho in fechado):
                continue

            if (vizinho not in aberto):
                aberto.append(vizinho)

    return None
Пример #8
0
def aestrela(mapa, inicio, fim, heuristica):
    # Criar listas para nós abertos e nós fechados
    aberto = []
    fechado = []

    # Crie um nó representando o inicio e o objetivo
    inicio_no = No.No(inicio, None)
    objetivo_no = No.No(fim, None)

    # Adiciona nó inicial
    aberto.append(inicio_no)

    # Repetir até que a lista aberta esteja vazia
    while len(aberto) > 0:
        # Ordene a lista aberta para obter o nó com o menor custo primeiro
        aberto.sort()
        # Obtenha o nó com o menor custo
        no_atual = aberto.pop(0)
        # Adicione o nó atual à lista fechada
        fechado.append(no_atual)
        # Verifique se atingimos a meta, retorne o caminho
        if no_atual == objetivo_no:
            path = []
            while no_atual != inicio_no:
                path.append(no_atual.posicao)
                no_atual = no_atual.pai
            # Retornar caminho invertido
            return path[::-1]

        # Pega a posição atual do nó
        (x, y) = no_atual.posicao
        # Pega os vizinhos
        vizinhos = [(x - 1, y), (x + 1, y), (x, y - 1), (x, y + 1)]

        # Loop nos vizinhos
        for prox in vizinhos:
            # Pega valor do mapa
            mapa_valor = mapa.get(prox)
            # Verifique se é uma parede, fantasma ou obstáculo
            if ((mapa_valor == '#') or (mapa_valor == '&')
                    or (mapa_valor == ' ')):
                continue

            # Crie o nó vizinho
            vizinho = No.No(prox, no_atual)

            if (vizinho in fechado):
                continue
            # Gera heurísticas
            if (heuristica == 1):
                # Distância de Manhattan
                vizinho.g = h.distancia_manhattan(vizinho.posicao[0],
                                                  inicio_no.posicao[0],
                                                  vizinho.posicao[1],
                                                  inicio_no.posicao[1])
                vizinho.h = h.distancia_manhattan(vizinho.posicao[0],
                                                  objetivo_no.posicao[0],
                                                  vizinho.posicao[1],
                                                  objetivo_no.posicao[1])
            else:
                # Distância de Euclides
                vizinho.g = h.euclidiano(vizinho.posicao[0],
                                         inicio_no.posicao[0],
                                         vizinho.posicao[1],
                                         inicio_no.posicao[1])
                vizinho.h = h.euclidiano(vizinho.posicao[0],
                                         objetivo_no.posicao[0],
                                         vizinho.posicao[1],
                                         objetivo_no.posicao[1])
            vizinho.f = vizinho.g + vizinho.h  # Custo total é o somatório do inicio mais a heurística
            # Verifique se o vizinho deve ser adicionado à lista aberta
            for no in aberto:
                if (vizinho == no and vizinho.f > no.f):
                    continue
            aberto.append(vizinho)
    # Retorne vazio, não há caminho
    return None