示例#1
0
def vns(optimum_value: float, instance_dict: dict, output_filename: str) -> Solution:
    config = settings.EVALUATE_METHODS_SETTINGS
    max_iterations = config.get('vns', {}).get('max_iterations')
    neighborhood_size = config.get('vns', {}).get('neighborhood_size')
    
    solution = Solution(
        n=instance_dict.get('n'),
        capacity=instance_dict.get('capacity'),
        optimum=optimum_value
    )
    solution.generate_starter_solution(
        item_list=instance_dict.get('item_list'),
        random_seed=RANDOM_SEED
    )
    #solution.print_solution()

    vns_method = Vns(
        item_list=instance_dict.get('item_list'),
        neighborhood_size=neighborhood_size
    )
    
    vns_method.run_vns(
        solution=solution,
        item_list=instance_dict.get('item_list'),
        max_iterations=max_iterations,
        neighborhood_size=neighborhood_size,
        output_filename=output_filename
    )
    print(f"ic| VNS Optimum Solution")
    solution.print_solution(item_list=instance_dict.get('item_list'))
    return solution
示例#2
0
def simulated_annealing(optimum_value: float, instance_dict: dict, output_filename: str):
    config = settings.EVALUATE_METHODS_SETTINGS
    max_iterations = config.get('sa', {}).get('max_iterations')
    distance = config.get('sa', {}).get('distance')
    initial_temperature = config.get('sa', {}).get('initial_temperature')
    
    best_solution = Solution(
        n=instance_dict.get('n'),
        capacity=instance_dict.get('capacity'),
        optimum=optimum_value
    )
    best_solution.generate_starter_solution(
        item_list=instance_dict.get('item_list'),
        random_seed=RANDOM_SEED
    )
    best_solution.print_solution()

    sa = SimulatedAnnealing(
        solution=deepcopy(best_solution),
        item_list=instance_dict.get('item_list'),
        distance=2,
        output_filename=f"{output_filename}_temp"
    )

    current_solution = deepcopy(sa.solution)
    writer = FileWriter(file_name=f"{output_filename}_temp")

    for i in range(max_iterations):

        if i == 0:
            writer.write_line(output_filename.replace('TEMP-', ''))
            writer.write_line(str(current_solution.optimum))
            writer.write_line(f"{i} {current_solution.value}")

        sa.solution = deepcopy(current_solution)

        # random neighbor
        test = sa.random_neighbor(distance=distance)

        if not test:
            print(f"ERROR ! Could not find a random neighbor")

        # if better set as best_solution
        if sa.solution.value > best_solution.value:
            best_solution = deepcopy(sa.solution)
            writer.write_line(f"{i} {best_solution.value}")
        # calculate diff
        diff = current_solution.value - sa.solution.value
        # calculate temp
        t = initial_temperature / float(i + 1)
        if diff < 0 or random() < exp(-diff / t):
            current_solution = deepcopy(sa.solution)

    print(f"ic| SA Optimum Solution")
    best_solution.print_solution(item_list=instance_dict.get('item_list'))
    return best_solution
示例#3
0
def iterated_local_search(optimum_value: float, instance_dict: dict,
                          output_filename: str) -> Solution:
    config = settings.EVALUATE_METHODS_SETTINGS
    max_iterations = config.get('ils', {}).get('max_iterations')

    best_solution = Solution(n=instance_dict.get('n'),
                             capacity=instance_dict.get('capacity'),
                             optimum=optimum_value)
    best_solution.generate_starter_solution(
        item_list=instance_dict.get('item_list'), random_seed=RANDOM_SEED)

    counter = 0

    for i in range(max_iterations):
        perturbed_solution = deepcopy(best_solution)
        perturbed_solution.perturb_solution(
            item_list=instance_dict.get('item_list'))

        print(f"Iteration {i}")

        if i == 0:
            ils = IteratedLocalSearch(
                solution=perturbed_solution,
                item_list=instance_dict.get('item_list'),
                distance=2,
                output_filename=f"{output_filename}_temp")
        else:
            ils.solution = deepcopy(perturbed_solution)

        ils.run(counter)

        while not ils.check_acceptance_criteria(best_solution):
            ils.solution.perturb_solution(
                item_list=instance_dict.get('item_list'))
            ils.run(counter)

        if ils.solution.value > best_solution.value:
            counter += 1
            best_solution = deepcopy(ils.solution)
            best_solution.print_solution()
            ils.output_file.write_line(f"{counter} {ils.solution.value}")

    print(f"ic| ILS Optimum Solution")
    best_solution.print_solution(item_list=instance_dict.get('item_list'))
    return best_solution
示例#4
0
def single_start_local_search(optimum_value: float, instance_dict: dict,
                              output_filename: str) -> Solution:
    solution = Solution(n=instance_dict.get('n'),
                        capacity=instance_dict.get('capacity'),
                        optimum=optimum_value)
    solution.generate_starter_solution(
        item_list=instance_dict.get('item_list'), random_seed=RANDOM_SEED)
    #solution.print_solution()

    local_search = LocalSearch(solution=solution,
                               item_list=instance_dict.get('item_list'),
                               distance=2,
                               output_filename=output_filename,
                               improved=True)
    local_search.run()

    print(f"ic| SSL Optimum Solution")
    solution.print_solution(item_list=instance_dict.get('item_list'))
    return solution
示例#5
0
def tabu_search(optimum_value: float, instance_dict: dict, output_filename: str):
    config = settings.EVALUATE_METHODS_SETTINGS
    max_iterations = config.get('tabu', {}).get('max_iterations')
    
    best_solution = Solution(
        n=instance_dict.get('n'),
        capacity=instance_dict.get('capacity'),
        optimum=optimum_value
    )
    best_solution.generate_starter_solution(
        item_list=instance_dict.get('item_list'),
        random_seed=RANDOM_SEED
    )
    best_solution.print_solution()

    tabu_list = {}
    tabu_tenure = config.get('tabu', {}).get('tenure')

    tabu_search = TabuSearch(
        solution=deepcopy(best_solution),
        item_list=instance_dict.get('item_list'),
        distance=2,
        output_filename=f"{output_filename}_temp"
    )

    for _ in range(max_iterations):
        tabu_search.run(tabu_list=tabu_list)
        if tabu_search.solution.value > best_solution.value:
            best_solution = deepcopy(tabu_search.solution)

        # decrement tenure, removes if 0
        for solution in tabu_list.copy():
            tabu_list[solution] -= 1
            if tabu_list[solution] == 0:
                del tabu_list[solution]

        # add new solution to list
        number = int(''.join([str(x) for x in tabu_search.solution.item_list]), 2)
        tabu_list[number] = tabu_tenure

    print(f"ic| Tabu Optimum Solution")
    best_solution.print_solution(item_list=instance_dict.get('item_list'))
    return best_solution
示例#6
0
def multi_start_local_search(optimum_value: float, instance_dict: dict,
                             output_filename: str) -> Solution:
    config = settings.EVALUATE_METHODS_SETTINGS
    max_iterations = config.get('msl', {}).get('max_iterations')

    best_solution = None
    counter = 0
    msl = None

    for i in range(max_iterations):

        print(f"Iteration {i}")

        random_solution = Solution(n=instance_dict.get('n'),
                                   capacity=instance_dict.get('capacity'),
                                   optimum=optimum_value)
        random_solution.generate_starter_solution(
            item_list=instance_dict.get('item_list'),
            random_seed=(RANDOM_SEED + i))
        #random_solution.print_solution()

        if i == 0:
            msl = MultiStartLocalSearch(
                solution=random_solution,
                item_list=instance_dict.get('item_list'),
                distance=2,
                output_filename=f"{output_filename}_temp")
        else:
            msl.solution = deepcopy(random_solution)

        msl.run(counter=counter)

        if best_solution is None or msl.solution.value > best_solution.value:
            counter += 1
            msl.output_file.write_line(f"{counter} {msl.solution.value}")
            best_solution = deepcopy(msl.solution)

    print(f"ic| MSL Optimum Solution")
    best_solution.print_solution(item_list=instance_dict.get('item_list'))
    return best_solution