Exemplo n.º 1
0
def vns_opt(initial_solution, value_of_initial, limit_k, iterations, dist_matrix):

    problem_size = len(initial_solution)
    value_best_solution = value_of_initial
    best_solution = initial_solution[:]
    echo("Primera Solucion", value_best_solution)
    stop_condition = 0
    #intento de VNS
    #se hace hasta que se alcance el criterio de parada
    while stop_condition < iterations:
        neigborhood = 1
        #repito hasta que alcance al limite de vecindarios
        while neigborhood < limit_k:
            #creo una solucion de el vecindario correspondiente a neigborhood
            k = problem_size/(neigborhood)
            neighbor = perturb(best_solution, k, problem_size)
            value_neighbor = fobj(neighbor, dist_matrix)
            local_optima, value_local_optima = find_local_optima_2opt(neighbor, value_neighbor, dist_matrix)
            #print "partial solution",value_local_optima,"best solution",best_solution,"neig",k

            if value_local_optima < value_best_solution:
                #me muevo a la nueva solucion
                echo("new best solution", value_local_optima)
                value_best_solution = value_local_optima
                best_solution = local_optima[:]
                neigborhood = 1
            else:
                neigborhood+=1

        stop_condition+=1
    solution_validator(best_solution, problem_size)
    return value_best_solution,best_solution
Exemplo n.º 2
0
def vns_opt(initial_solution, value_of_initial, limit_k, iterations,
            dist_matrix):

    problem_size = len(initial_solution)
    value_best_solution = value_of_initial
    best_solution = initial_solution[:]
    echo("Primera Solucion", value_best_solution)
    stop_condition = 0
    #intento de VNS
    #se hace hasta que se alcance el criterio de parada
    while stop_condition < iterations:
        neigborhood = 1
        #repito hasta que alcance al limite de vecindarios
        while neigborhood < limit_k:
            #creo una solucion de el vecindario correspondiente a neigborhood
            k = problem_size / (neigborhood)
            neighbor = perturb(best_solution, k, problem_size)
            value_neighbor = fobj(neighbor, dist_matrix)
            local_optima, value_local_optima = find_local_optima_2opt(
                neighbor, value_neighbor, dist_matrix)
            #print "partial solution",value_local_optima,"best solution",best_solution,"neig",k

            if value_local_optima < value_best_solution:
                #me muevo a la nueva solucion
                echo("new best solution", value_local_optima)
                value_best_solution = value_local_optima
                best_solution = local_optima[:]
                neigborhood = 1
            else:
                neigborhood += 1

        stop_condition += 1
    solution_validator(best_solution, problem_size)
    return value_best_solution, best_solution
Exemplo n.º 3
0
def opt2_(solution=[], dist_matrix=[]):
    """
        Implementacion del algoritmo 2-Optimo o como se supone que deveria
        funcionar el algoritmo de arriba
    """
    n_vertex = len(solution)
    soluc = solution[:]
    for i in xrange(n_vertex - 2):
        for j in xrange(i+2, n_vertex - 1):
            sol = soluc[:]
            ini = soluc[:i+1]
            med = soluc[i+1:j+1]
            med.reverse()
            fin = soluc[j+1:]
            sol = ini + med + fin
            if fobj(sol, dist_matrix) < fobj(soluc, dist_matrix):
                soluc = sol[:]
    return soluc
Exemplo n.º 4
0
def opt2_(solution=[], dist_matrix=[]):
    """
        Implementacion del algoritmo 2-Optimo o como se supone que deveria
        funcionar el algoritmo de arriba
    """
    n_vertex = len(solution)
    soluc = solution[:]
    for i in xrange(n_vertex - 2):
        for j in xrange(i + 2, n_vertex - 1):
            sol = soluc[:]
            ini = soluc[:i + 1]
            med = soluc[i + 1:j + 1]
            med.reverse()
            fin = soluc[j + 1:]
            sol = ini + med + fin
            if fobj(sol, dist_matrix) < fobj(soluc, dist_matrix):
                soluc = sol[:]
    return soluc
Exemplo n.º 5
0
def vns_opt_improved(initial_solution, value_of_initial, limit_k, iterations,
                     probability, dist_matrix):
    maximum = 1
    problem_size = len(initial_solution)
    value_best_solution = value_of_initial
    best_solution = initial_solution[:]
    memory = create_memory(problem_size)
    echo("Primera Solucion", value_best_solution)
    stop_condition = 0
    #intento de VNS
    #se hace hasta que se alcance el criterio de parada
    iter_counter = 0
    invert_mode = False
    while stop_condition < iterations:
        neigborhood = 1
        #repito hasta que alcance al limite de vecindarios
        while neigborhood < limit_k:
            iter_counter += 1
            #creo una solucion de el vecindario correspondiente a neigborhood
            k = problem_size / (neigborhood)
            #k = problem_size-((problem_size/limit_k)*neigborhood)
            #neighbor = perturb(best_solution, k, problem_size)
            if iter_counter == 50:
                invert_mode = True
                #memory = create_memory(problem_size)
            neighbor = create_neighbor(best_solution, k, memory, maximum,
                                       probability, dist_matrix, invert_mode)
            value_neighbor = fobj(neighbor, dist_matrix)
            local_optima, value_local_optima = find_local_optima_2opt(
                neighbor, value_neighbor, dist_matrix)
            #print "partial solution",value_local_optima,"best solution",value_best_solution,"neig",k
            if value_local_optima <= (value_best_solution * 1.1):
                #memory,maximum = update_memory(memory,local_optima,maximum)
                memory, maximum = update_memory(memory, neighbor, maximum)
                #print "memory updated", value_local_optima, (value_best_solution*1.1)
            #else:
            #print "no update", value_local_optima, (value_best_solution*1.1)
            if value_local_optima < value_best_solution:
                #me muevo a la nueva solucion
                echo("new best solution", value_local_optima, "iter",
                     iter_counter)
                value_best_solution = value_local_optima
                best_solution = local_optima[:]
                neigborhood = 1
                iter_counter = 0
                invert_mode = False
            else:
                neigborhood += 1

        stop_condition += 1
    echo(iter_counter)
    solution_validator(best_solution, problem_size)
    return value_best_solution, best_solution
Exemplo n.º 6
0
def vns_opt_improved(initial_solution, value_of_initial, limit_k, iterations, probability, dist_matrix):
    maximum = 1
    problem_size = len(initial_solution)
    value_best_solution = value_of_initial
    best_solution = initial_solution[:]
    memory = create_memory(problem_size)
    echo("Primera Solucion", value_best_solution)
    stop_condition = 0
    #intento de VNS
    #se hace hasta que se alcance el criterio de parada
    iter_counter = 0
    invert_mode = False
    while stop_condition < iterations:
        neigborhood = 1
        #repito hasta que alcance al limite de vecindarios
        while neigborhood < limit_k:
            iter_counter += 1
            #creo una solucion de el vecindario correspondiente a neigborhood
            k = problem_size/(neigborhood)
            #k = problem_size-((problem_size/limit_k)*neigborhood)
            #neighbor = perturb(best_solution, k, problem_size)
            if iter_counter == 50:
                invert_mode = True
                #memory = create_memory(problem_size)
            neighbor = create_neighbor(best_solution,k,memory,maximum,probability,dist_matrix,invert_mode)
            value_neighbor = fobj(neighbor, dist_matrix)
            local_optima, value_local_optima = find_local_optima_2opt(neighbor, value_neighbor, dist_matrix)
            #print "partial solution",value_local_optima,"best solution",value_best_solution,"neig",k
            if value_local_optima <= (value_best_solution*1.1):
                #memory,maximum = update_memory(memory,local_optima,maximum)
                memory,maximum = update_memory(memory,neighbor,maximum)
                #print "memory updated", value_local_optima, (value_best_solution*1.1)
            #else:
                #print "no update", value_local_optima, (value_best_solution*1.1)
            if value_local_optima < value_best_solution:
                #me muevo a la nueva solucion
                echo("new best solution", value_local_optima, "iter", iter_counter)
                value_best_solution = value_local_optima
                best_solution = local_optima[:]
                neigborhood = 1
                iter_counter = 0
                invert_mode = False
            else:
                neigborhood += 1

        stop_condition+=1
    echo(iter_counter)
    solution_validator(best_solution, problem_size)
    return value_best_solution, best_solution
Exemplo n.º 7
0
def find_local_optima_2opt(solution_o = [],value_of_solution = 0, distances = []):
    """
        Aplica una heurística hasta que encuentra un optimo local
    """
    solution = solution_o[:]
    value_temp = 0
    local_optima = 0
    while not local_optima:
        temp_solution = opt2(solution,distances)
        value_temp = fobj(temp_solution, distances)
        if value_of_solution == value_temp:
            local_optima = 1
        if value_temp < value_of_solution:
            solution = temp_solution
            value_of_solution = value_temp
    return solution, value_of_solution
Exemplo n.º 8
0
def find_local_optima_2opt(solution_o=[], value_of_solution=0, distances=[]):
    """
        Aplica una heurística hasta que encuentra un optimo local
    """
    solution = solution_o[:]
    value_temp = 0
    local_optima = 0
    while not local_optima:
        temp_solution = opt2(solution, distances)
        value_temp = fobj(temp_solution, distances)
        if value_of_solution == value_temp:
            local_optima = 1
        if value_temp < value_of_solution:
            solution = temp_solution
            value_of_solution = value_temp
    return solution, value_of_solution
Exemplo n.º 9
0
def find_local_optima_2optmod(solution = [],value_of_solution = 0, distances = []):
    """
        Aplica una heurística hasta que encuentra un optimo local
    """
    value_temp = 0
    local_optima = 0
    counter = 0
    while not local_optima:
        temp_solution = vns_opt2(solution,distances)
        value_temp = fobj(temp_solution, distances)
        if value_of_solution == value_temp:
            local_optima = 1
        if value_temp < value_of_solution:
            solution = temp_solution
            value_of_solution = value_temp
        counter +=1
        print counter
    return solution, value_of_solution
Exemplo n.º 10
0
def find_local_optima_2optmod(solution=[], value_of_solution=0, distances=[]):
    """
        Aplica una heurística hasta que encuentra un optimo local
    """
    value_temp = 0
    local_optima = 0
    counter = 0
    while not local_optima:
        temp_solution = vns_opt2(solution, distances)
        value_temp = fobj(temp_solution, distances)
        if value_of_solution == value_temp:
            local_optima = 1
        if value_temp < value_of_solution:
            solution = temp_solution
            value_of_solution = value_temp
        counter += 1
        print counter
    return solution, value_of_solution