Source code for discrete_optimization.rcpsp_multiskill.solvers_map

#  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 discrete_optimization.generic_rcpsp_tools.solvers.gphh import (
    GphhGenericRcpspSolver,
)
from discrete_optimization.generic_rcpsp_tools.solvers.lns_cp import (
    LnsCpMznGenericRcpspSolver,
)
from discrete_optimization.generic_rcpsp_tools.solvers.ls import LsGenericRcpspSolver
from discrete_optimization.generic_tools.result_storage.result_storage import (
    ResultStorage,
)
from discrete_optimization.rcpsp_multiskill.problem import (
    MultiskillRcpspProblem,
    VariantMultiskillRcpspProblem,
)
from discrete_optimization.rcpsp_multiskill.solvers.cp_mzn import (
    CpMultiskillRcpspSolver,
    CpPreemptiveMultiskillRcpspSolver,
)
from discrete_optimization.rcpsp_multiskill.solvers.cpsat import (
    CpSatMultiskillRcpspSolver,
)
from discrete_optimization.rcpsp_multiskill.solvers.ga import GaMultiskillRcpspSolver
from discrete_optimization.rcpsp_multiskill.solvers.lp import (
    MathOptMultiskillRcpspSolver,
)

solvers = {
    "lp": [
        (
            MathOptMultiskillRcpspSolver,
            {},
        )
    ],
    "cp": [
        (
            CpSatMultiskillRcpspSolver,
            {},
        ),
        (
            CpMultiskillRcpspSolver,
            {},
        ),
        (
            CpPreemptiveMultiskillRcpspSolver,
            {
                "nb_preemptive": 5,
            },
        ),
    ],
    "ls": [(LsGenericRcpspSolver, {"nb_iteration_max": 20})],
    "ga": [(GaMultiskillRcpspSolver, {})],
    "lns-scheduling": [
        (
            LnsCpMznGenericRcpspSolver,
            {
                "nb_iteration_lns": 100,
                "nb_iteration_no_improvement": 100,
            },
        )
    ],
    "gphh": [(GphhGenericRcpspSolver, {})],
}

solvers_map = {}
for key in solvers:
    for solver, param in solvers[key]:
        solvers_map[solver] = (key, param)

solvers_compatibility = {
    MathOptMultiskillRcpspSolver: [
        MultiskillRcpspProblem,
        VariantMultiskillRcpspProblem,
    ],
    CpMultiskillRcpspSolver: [MultiskillRcpspProblem, VariantMultiskillRcpspProblem],
    LsGenericRcpspSolver: [MultiskillRcpspProblem, VariantMultiskillRcpspProblem],
    GaMultiskillRcpspSolver: [VariantMultiskillRcpspProblem],
    CpPreemptiveMultiskillRcpspSolver: [
        MultiskillRcpspProblem,
        VariantMultiskillRcpspProblem,
    ],
    LnsCpMznGenericRcpspSolver: [MultiskillRcpspProblem, VariantMultiskillRcpspProblem],
    GphhGenericRcpspSolver: [MultiskillRcpspProblem, VariantMultiskillRcpspProblem],
}


[docs] def look_for_solver(domain): class_domain = domain.__class__ return look_for_solver_class(class_domain)
[docs] def look_for_solver_class(class_domain): available = [] for solver in solvers_compatibility: if class_domain in solvers_compatibility[solver]: available += [solver] return available
[docs] def solve(method, problem: MultiskillRcpspProblem, **args) -> ResultStorage: solver = method(problem, **args) try: solver.init_model(**args) except: pass return solver.solve(**args)
[docs] def return_solver(method, problem: MultiskillRcpspProblem, **args) -> ResultStorage: solver = method(problem, **args) try: solver.init_model(**args) except: pass return solver