Source code for discrete_optimization.generic_tools.ls.local_search

#  Copyright (c) 2022 AIRBUS and its affiliates.
#  This source code is licensed under the MIT license found in the
#  LICENSE file in the root directory of this source tree.

from enum import Enum
from typing import Tuple

from discrete_optimization.generic_tools.do_problem import Solution
from discrete_optimization.generic_tools.result_storage.result_storage import (
    ResultStorage,
    fitness_class,
)


[docs] class ModeMutation(Enum): MUTATE = 0 MUTATE_AND_EVALUATE = 1
[docs] class RestartHandler: solution_restart: Solution solution_best: Solution best_fitness: fitness_class def __init__(self) -> None: self.nb_iteration = 0 self.nb_iteration_no_local_improve = 0 self.nb_iteration_no_global_improve = 0
[docs] def update( self, nv: Solution, fitness: fitness_class, improved_global: bool, improved_local: bool, ) -> None: self.nb_iteration += 1 if improved_global: self.nb_iteration_no_global_improve = 0 self.best_fitness = fitness self.solution_best = nv.copy() else: self.nb_iteration_no_global_improve += 1 if improved_local: self.nb_iteration_no_local_improve = 0 else: self.nb_iteration_no_local_improve += 1
[docs] def restart( self, cur_solution: Solution, cur_objective: fitness_class ) -> Tuple[Solution, fitness_class]: return cur_solution, cur_objective
[docs] class RestartHandlerLimit(RestartHandler): def __init__( self, nb_iteration_no_improvement: int, ): RestartHandler.__init__(self) self.nb_iteration_no_improvement = nb_iteration_no_improvement
[docs] def restart( self, cur_solution: Solution, cur_objective: fitness_class ) -> Tuple[Solution, fitness_class]: if ( self.nb_iteration_no_global_improve > self.nb_iteration_no_improvement or self.nb_iteration_no_local_improve > self.nb_iteration_no_improvement ): self.nb_iteration_no_global_improve = 0 self.nb_iteration_no_local_improve = 0 return self.solution_best.copy(), self.best_fitness else: return cur_solution, cur_objective
[docs] class ResultLS(ResultStorage): def __init__( self, result_storage: ResultStorage, best_solution: Solution, best_objective: fitness_class, ): self.result_storage = result_storage self.list_solution_fits = result_storage.list_solution_fits self.maximize = result_storage.maximize self.limit_store = result_storage.limit_store self.nb_best_score = result_storage.nb_best_score self.map_solutions = result_storage.map_solutions self.heap = result_storage.heap self.min = result_storage.min self.max = result_storage.max self.best_solution = best_solution self.best_objective = best_objective