Exemplo n.º 1
0
def tournament(sols, vehicles, nodes, L=30):
    selected_sols = []
    selected_vehicles = []
    selected_nodes = []
    while len(selected_sols) < L:
        i1 = random.randint(0, len(sols) - 1)
        sol1 = sols.pop(i1)
        z1 = of(vehicles[i1], nodes[i1], sol1)
        i2 = random.randint(0, len(sols) - 1)
        sol2 = sols.pop(i2)
        z2 = of(vehicles[i2], nodes[i2], sol2)

        if z1 < z2:
            selected_sols.append(sol1)
            selected_vehicles.append(vehicles[i1])
            selected_nodes.append(nodes[i1])
            sols.insert(i2, sol2)
        else:
            selected_sols.append(sol2)
            selected_vehicles.append(vehicles[i2])
            selected_nodes.append(nodes[i2])
            sols.insert(i1, sol1)
    return selected_sols, selected_nodes, selected_vehicles
def vnd(sol, nodes, vehicles, old_z, l=5):
    j = 0
    new_sol = copy.deepcopy(sol)
    z = old_z
    while j <= l:
        if j % 3 == 0:
            new_sol = two_opt(new_sol, nodes)
            z = of(vehicles, nodes, new_sol)
        elif j % 3 == 1:
            new_sol, z = one_one_exchange(new_sol, nodes, vehicles, z)
        elif j % 3 == 2:
            new_sol, z = move(new_sol, nodes, vehicles, z)
        j += 1
    return new_sol, z
Exemplo n.º 3
0
def hybrid_ga_vnd(nodes, vehicles, gen=5, l=3, p_mut=0.4, people=60):
    sols, complete_nodes, complete_vehicles = grasp(
        nodes, vehicles, k=people)  # Initial solutions
    j = 0
    selected_sols = sols
    while j < gen:
        selected_sols, selected_nodes, selected_vehicles = tournament(
            selected_sols, complete_vehicles,
            complete_nodes)  # Selection by tournament
        while len(selected_sols) < people:
            index_sol = random.randint(0, len(selected_sols) - 1)
            for k in range(l):
                child, node, vehicle = one_point_crossover(
                    selected_sols[index_sol], selected_nodes[index_sol],
                    selected_vehicles[index_sol])
                if child is not None:
                    z_child = of(vehicle, node, child)
                    if random.random() < p_mut:  # Mutation
                        child, vehicle, node = mutation(child, vehicle, node)
                    child, z_child = vnd(child, node, vehicle,
                                         z_child)  # Local search
                    selected_sols.append(child)
                    selected_nodes.append(node)
                    selected_vehicles.append(vehicle)
                    break
        j += 1
    j = 0
    best_z = np.Inf
    best_sol = []
    for sol in selected_sols:
        z = of(selected_vehicles[j], selected_nodes[j], sol)
        if z < best_z:
            best_z = z
            best_sol = sol
        j += 1
    return best_sol, best_z
def move(sol, nodes, vehicles, old_z):
    new_sol = copy.deepcopy(sol)
    prev_sol = copy.deepcopy(sol)
    for r in range(len(new_sol)):
        route = new_sol[r]
        n = len(route)
        if len(route) > 4:
            for i in range(1, n - 2):
                for j in range(i + 1, n - 1):
                    route.insert(j, route.pop(i))
                    z = of(vehicles, nodes, new_sol)
                    if z < old_z:
                        route_prev = prev_sol[r]
                        route_prev.insert(j, route_prev.pop(i))
                        old_z = z
                    else:
                        route.insert(j, route.pop(i))
    return prev_sol, old_z
Exemplo n.º 5
0
def hybrid_ga(nodes, vehicles, gen=5, l=3, p_mut=0.4, people=60):
    sols, complete_nodes, complete_vehicles = grasp(
        nodes, vehicles, k=people)  # Initial solutions
    j = 0
    selected_sols = sols
    while j < gen:
        selected_sols, selected_nodes, selected_vehicles = tournament(
            selected_sols, complete_vehicles,
            complete_nodes)  # Selection by tournament
        while len(selected_sols) < people:
            index_sol = random.randint(0, len(selected_sols) - 1)
            for k in range(l):
                child, node, vehicle = one_point_crossover(
                    selected_sols[index_sol], selected_nodes[index_sol],
                    selected_vehicles[index_sol])
                if child is not None:
                    z_child = of(vehicle, node, child)
                    if random.random() < p_mut:  # Mutation
                        child, vehicle, node = mutation(child, vehicle, node)
                    selected_sols.append(child)
                    selected_nodes.append(node)
                    selected_vehicles.append(vehicle)
                    break
        j += 1
    j = 0
    best_z = np.Inf
    best_sol = []
    index = [i for i in range(len(selected_sols))]
    selected_sols_aux = list(zip(index, selected_sols))
    selected_sols_aux = random.sample(selected_sols_aux, 10)

    for t in selected_sols_aux:
        sol = t[1]
        i = t[0]
        sol, z = vnd(sol, selected_nodes[i], selected_vehicles[i],
                     best_z)  # Local search
        if z < best_z:
            best_z = z
            best_sol = sol
        j += 1
    return best_sol, best_z
def one_one_exchange(sol, nodes, vehicles, old_z):
    new_sol = copy.deepcopy(sol)
    prev_sol = copy.deepcopy(sol)
    for r1 in range(len(new_sol) - 1):
        for r2 in range(r1, len(new_sol)):
            for i in range(1, len(new_sol[r1]) - 1):
                for j in range(1, len(new_sol[r2]) - 1):
                    new_sol[r1][i], new_sol[r2][j] = new_sol[r2][j], new_sol[r1][i]
                    nodes['assigned'][i][1], nodes['assigned'][j][1] = nodes['assigned'][j][1], nodes['assigned'][i][1]
                    if check_route(new_sol[r1], nodes, vehicles['capacity'][nodes['assigned'][i][1]]) and \
                            check_route(new_sol[r2], nodes, vehicles['capacity'][nodes['assigned'][j][1]]):
                        new_z = of(vehicles, nodes, new_sol)
                        if new_z - old_z < 0:
                            prev_sol = copy.deepcopy(new_sol)
                            old_z = new_z
                        else:
                            new_sol[r1][i], new_sol[r2][j] = new_sol[r2][j], new_sol[r1][i]
                            nodes['assigned'][i][1], nodes['assigned'][j][1] = nodes['assigned'][j][1], \
                                                                               nodes['assigned'][i][1]
                    else:
                        new_sol[r1][i], new_sol[r2][j] = new_sol[r2][j], new_sol[r1][i]
                        nodes['assigned'][i][1], nodes['assigned'][j][1] = nodes['assigned'][j][1], \
                                                                           nodes['assigned'][i][1]
    return prev_sol, old_z
file_name_grasp = 'grasp.csv'
file_name_vnd = 'vnd_noise.csv'
outfile_grasp = open(file_name_grasp, 'w')
outfile_vnd = open(file_name_vnd, 'w')

for i in range(1, 22):

    print('dataset ' + str(i))
    # Read data set
    vehicles, nodes = read_data(i)
    print('finished reading data')

    # Constructive Algorithm
    sol = sweep(vehicles, nodes)
    z = of(vehicles, nodes, sol)
    print('finished constructive solution')

    # GRASP
    # if i != 20:
    #     time_prev = time.clock()
    #     sol_grasp, z_grasp = grasp(nodes, vehicles)
    #     time_after = time.clock()
    #     if sol_grasp == 'NaN':
    #         outfile_grasp.write(str(i) + ',' + str(len(nodes['index'])) + ',' + 'inf,inf,inf\n')
    #         continue
    #     print('finished GRASP')
    #     exec_time = str(round(time_after - time_prev, 2))
    #     percent = str(round(100 * ((z - z_grasp) / z), 2))
    #
    #     outfile_grasp.write(str(i) + ',' + str(len(nodes['index'])) + ',' + percent + ',' + exec_time + ',' +