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
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
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
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
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
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