Source code for discrete_optimization.rcpsp.solvers.ga

#  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 typing import Optional

from discrete_optimization.generic_tools.ea.alternating_ga import AlternatingGa
from discrete_optimization.generic_tools.ea.ga import Ga
from discrete_optimization.generic_tools.ea.ga_tools import (
    DeapCrossover,
    ParametersAltGa,
    ParametersGa,
)
from discrete_optimization.rcpsp.problem import RcpspProblem
from discrete_optimization.rcpsp.solvers import RcpspSolver


[docs] class GaRcpspSolver(RcpspSolver): problem: RcpspProblem hyperparameters = Ga.copy_and_update_hyperparameters( crossover=dict( choices=[ DeapCrossover.CX_UNIFORM_PARTIALY_MATCHED, DeapCrossover.CX_ORDERED, DeapCrossover.CX_PARTIALY_MATCHED, ] ) ) # RCPSP needs permutation encoding, not all crossover are available.
[docs] def solve(self, parameters_ga: Optional[ParametersGa] = None, **args): if parameters_ga is None: parameters_ga = ParametersGa.default_rcpsp() args = self.complete_with_default_hyperparameters(args) for key in args: setattr(parameters_ga, key, args[key]) ga_solver = Ga( problem=self.problem, encoding=parameters_ga.encoding, objective_handling=parameters_ga.objective_handling, objectives=parameters_ga.objectives, objective_weights=parameters_ga.objective_weights, mutation=parameters_ga.mutation, max_evals=parameters_ga.max_evals, crossover=parameters_ga.crossover, selection=parameters_ga.selection, pop_size=parameters_ga.pop_size, mut_rate=parameters_ga.mut_rate, crossover_rate=parameters_ga.crossover_rate, tournament_size=parameters_ga.tournament_size, deap_verbose=parameters_ga.deap_verbose, ) return ga_solver.solve()
[docs] class GaMultimodeRcpspSolver(RcpspSolver): problem: RcpspProblem hyperparameters = Ga.hyperparameters
[docs] def solve( self, parameters_ga: ParametersAltGa = ParametersAltGa.default_mrcpsp(), **args ): if parameters_ga is None: parameters_ga = ParametersAltGa.default_mrcpsp() args = self.complete_with_default_hyperparameters(args) for key in args: setattr(parameters_ga, key, args[key]) ga_solver = AlternatingGa( problem=self.problem, encodings=parameters_ga.encodings, objective_handling=parameters_ga.objective_handling, objectives=parameters_ga.objectives, objective_weights=parameters_ga.objective_weights, mutations=parameters_ga.mutations, selections=parameters_ga.selections, crossovers=parameters_ga.crossovers, max_evals=parameters_ga.max_evals, sub_evals=parameters_ga.sub_evals, pop_size=parameters_ga.pop_size, mut_rate=parameters_ga.mut_rate, crossover_rate=parameters_ga.crossover_rate, tournament_size=parameters_ga.tournament_size, deap_verbose=parameters_ga.deap_verbose, ) return ga_solver.solve()