예제 #1
0
def HillClimbing(t, vt, tempo_limite):
    tempo = time()

    estado = [0] * len(vt)

    while True:
        vizinhos = VizinhosPositivos(estado)

        # TIMER CHECK
        if (time() - tempo) >= tempo_limite:
            break

        vizinhos = list(filter(lambda e: EhValido(e, t, vt), vizinhos))

        # TIMER CHECK
        if (time() - tempo) >= tempo_limite:
            break

        if len(vizinhos) <= 0:
            break

        estado = max(vizinhos, key=lambda e: Valor(e, vt))

    tempo = time() - tempo

    return estado, Valor(estado, vt), Tamanho(estado, vt), tempo
예제 #2
0
def DeepestDescent(t, vt, inicio, tempo, tempo_limite):
    estado = inicio

    while True:
        # TIMER CHECK
        if (time() - tempo) >= tempo_limite:
            break

        vizinhos = VizinhosPositivos(estado)

        # TIMER CHECK
        if (time() - tempo) >= tempo_limite:
            break

        vizinhos = list(filter(lambda e: EhValido(e, t, vt), vizinhos))

        # TIMER CHECK
        if (time() - tempo) >= tempo_limite:
            break

        continuar = False

        for vizinho in vizinhos:
            # TIMER CHECK
            if (time() - tempo) >= tempo_limite:
                break

            if Valor(vizinho, vt) > Valor(estado, vt):
                estado = vizinho
                continuar = True

        if not continuar:
            break

    return estado, Valor(estado, vt), Tamanho(estado, vt)
예제 #3
0
def BeamSearch(t, vt, tempo_limite, m):
    tempo = time()

    estado = [0] * len(vt)

    fila = Queue()
    fila.put(estado)

    while True:
        if (time() - tempo) >= tempo_limite:
            break

        expandidos = []

        for _ in range(fila.qsize()):
            vizinhos = VizinhosPositivos(fila.get())
            vizinhos = list(filter(lambda e: EhValido(e, t, vt), vizinhos))
            expandidos.extend(vizinhos)

        if len(expandidos) <= 0:
            break

        expandidos.sort(key=lambda e: Valor(e, vt), reverse=True)
        melhores = expandidos[:m]

        [fila.put(e) for e in melhores]

    estado = melhores[0]

    tempo = time() - tempo

    return estado, Valor(estado, vt), Tamanho(estado, vt), tempo
예제 #4
0
def SimulatedAnnealing(t, vt, tempo_limite, iteracoes, temperatura, alpha):
    tempo = time()

    estado = [0] * len(vt)
    aux = [0] * len(vt)

    while temperatura > 0.1:
        if (time() - tempo) >= tempo_limite:
            break

        for _ in range(iteracoes):
            vizinho = VizinhoAleatorio(aux)

            if not EhValido(vizinho, t, vt):
                continue

            if Valor(vizinho, vt) > Valor(aux, vt):
                aux = vizinho

                if Valor(aux, vt) > Valor(estado, vt):
                    estado = aux

            elif AceitaPior(Valor(vizinho, vt), Valor(aux, vt), temperatura):
                aux = vizinho

        temperatura *= alpha

    tempo = time() - tempo

    return estado, Valor(estado, vt), Tamanho(estado, vt), tempo
예제 #5
0
def Genetic(t, vt, tempo_limite, iteracoes, tamanho_populacao, taxa_crossover,
            taxa_mutacao):
    tempo = time()

    estado, valor, tamanho = [0] * len(vt), 0, 0

    populacao = [
        EstadoAleatorio(t, vt, tempo, tempo_limite)
        for _ in range(tamanho_populacao)
    ]

    for _ in range(iteracoes):
        if (time() - tempo) >= tempo_limite:
            break

        populacao.sort(key=lambda e: Valor(e, vt), reverse=True)
        gs = populacao.pop(0)

        if Valor(gs, vt) > Valor(estado, vt):
            estado = gs

        # TIMER CHECK
        if (time() - tempo) >= tempo_limite:
            break

        futuro = [gs]

        evoluidos = Evolve(populacao, t, vt, tamanho_populacao, taxa_crossover,
                           taxa_mutacao, tempo, tempo_limite)
        futuro.extend(evoluidos)

        # TIMER CHECK
        if (time() - tempo) >= tempo_limite:
            break

        estrangeiros = [
            EstadoAleatorio(t, vt, tempo, tempo_limite)
            for _ in range(tamanho_populacao - len(futuro))
        ]
        futuro.extend(estrangeiros)

        # TIMER CHECK
        if (time() - tempo) >= tempo_limite:
            break

        populacao = futuro

    tempo = time() - tempo

    return estado, Valor(estado, vt), Tamanho(estado, vt), tempo
예제 #6
0
def HillClimbing(t, vt, m, tempo, tempo_limite):
    estado = [0] * len(vt)

    while Tamanho(estado, vt) < (t // 2):
        # TIMER CHECK
        if (time() - tempo) >= tempo_limite:
            break

        vizinhos = VizinhosPositivos(estado)

        # TIMER CHECK
        if (time() - tempo) >= tempo_limite:
            break

        vizinhos = list(filter(lambda e: EhValido(e, t, vt), vizinhos))

        # TIMER CHECK
        if (time() - tempo) >= tempo_limite:
            break

        if len(vizinhos) <= 0:
            break

        vizinhos.sort(key=lambda e: Valor(e, vt), reverse=True)

        # TIMER CHECK
        if (time() - tempo) >= tempo_limite:
            break

        estado = Roleta(vizinhos[:m], vt, tempo, tempo_limite)

        # TIMER CHECK
        if (time() - tempo) >= tempo_limite:
            break

    return estado, Valor(estado, vt), Tamanho(estado, vt)
예제 #7
0
def Grasp(t, vt, tempo_limite, iteracoes, m):
    tempo = time()

    estado = [0] * len(vt)

    for _ in range(iteracoes):
        # TIMER CHECK
        if (time() - tempo) >= tempo_limite:
            break

        candidato = GreedyRandomConstruct(t, vt, m, tempo, tempo_limite)

        # TIMER CHECK
        if (time() - tempo) >= tempo_limite:
            break

        candidato = DeepestDescent(t, vt, candidato, tempo, tempo_limite)

        if candidato[1] > Valor(estado, vt):
            estado = candidato[0]

    tempo = time() - tempo

    return estado, Valor(estado, vt), Tamanho(estado, vt), tempo