Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions examples/binpack/run_cpsat.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ def run_cpsat():
p.nb_process = 16
res = solver.solve(
parameters_cp=p,
time_limit=20,
time_limit=100,
ortools_cpsat_solver_kwargs={"log_search_progress": True},
)
sol = res[-1][0]
Expand Down Expand Up @@ -64,4 +64,4 @@ def run_cpsat_ws():


if __name__ == "__main__":
run_cpsat_ws()
run_cpsat()
146 changes: 146 additions & 0 deletions examples/binpack/run_lns_generic.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,146 @@
# Copyright (c) 2025 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.

import logging

from discrete_optimization.binpack.parser import (
get_data_available_bppc,
parse_bin_packing_constraint_file,
)
from discrete_optimization.binpack.solvers.cpsat import (
CpSatBinPackSolver,
ModelingBinPack,
)
from discrete_optimization.generic_tasks_tools.solvers.lns_cp.constraint_extractor import (
BaseConstraintExtractor,
ConstraintExtractorList,
ConstraintExtractorPortfolio,
DummyConstraintExtractor,
NbChangesAllocationConstraintExtractor,
NbUsagesAllocationConstraintExtractor,
SchedulingConstraintExtractor,
SubresourcesAllocationConstraintExtractor,
SubtasksAllocationConstraintExtractor,
)
from discrete_optimization.generic_tasks_tools.solvers.lns_cp.constraint_handler import (
TasksConstraintHandler,
)
from discrete_optimization.generic_tasks_tools.solvers.lns_cp.neighbor_tools import (
NeighborBuilderMix,
NeighborBuilderSubPart,
NeighborRandom,
)
from discrete_optimization.generic_tools.callbacks.warm_start_callback import (
WarmStartCallback,
)
from discrete_optimization.generic_tools.cp_tools import ParametersCp
from discrete_optimization.generic_tools.lns_cp import LnsOrtoolsCpSat

logging.basicConfig(level=logging.INFO)


def run_lns():
f = [ff for ff in get_data_available_bppc() if "BPPC_6_2_9.txt" in ff][0]
problem = parse_bin_packing_constraint_file(f)
subsolver = CpSatBinPackSolver(problem=problem)
subsolver.init_model(modeling=ModelingBinPack.BINARY, upper_bound=450)
print("finished initializing")
extractors: list[BaseConstraintExtractor] = [
NbChangesAllocationConstraintExtractor(nb_changes_max=20),
NbUsagesAllocationConstraintExtractor(plus_delta_nb_usages_total=10),
SubresourcesAllocationConstraintExtractor(
frac_random_fixed_unary_resources=0.2
),
SubtasksAllocationConstraintExtractor(
fix_secondary_tasks_allocation=False, frac_random_fixed_tasks=0.2
),
DummyConstraintExtractor(),
]
constraints_extractor = ConstraintExtractorPortfolio(
extractors=extractors, weights=[1 / len(extractors)] * len(extractors)
)
# constraints_extractor = ConstraintExtractorList(extractors=extractors)
constraint_handler = TasksConstraintHandler(
problem=problem,
constraints_extractor=constraints_extractor,
)
solver = LnsOrtoolsCpSat(
problem=problem,
subsolver=subsolver,
constraint_handler=constraint_handler,
)
parameters_cp = ParametersCp.default_cpsat()
parameters_cp.nb_process = 15
res = solver.solve(
callbacks=[WarmStartCallback()],
nb_iteration_lns=30,
time_limit_subsolver=20,
time_limit_subsolver_iter0=20,
parameters_cp=parameters_cp,
skip_initial_solution_provider=True,
ortools_cpsat_solver_kwargs={
"log_search_progress": False,
"fix_variables_to_their_hinted_value": False,
},
)
sol = res.get_best_solution()
problem.satisfy(sol)


def run_lns_scheduling():
f = [ff for ff in get_data_available_bppc() if "BPPC_4_1_1.txt" in ff][0]
problem = parse_bin_packing_constraint_file(f)
subsolver = CpSatBinPackSolver(problem=problem)
subsolver.init_model(modeling=ModelingBinPack.SCHEDULING, upper_bound=450)
print("finished initializing")
n = NeighborBuilderMix(
list_neighbor=[
NeighborBuilderSubPart(problem=problem, nb_cut_part=5),
NeighborRandom(problem=problem, fraction_subproblem=0.5),
],
weight_neighbor=[1 / 2] * 2,
verbose=True,
)
extractors: list[BaseConstraintExtractor] = [
SchedulingConstraintExtractor(
plus_delta_primary=100,
minus_delta_primary=100,
plus_delta_secondary=2,
minus_delta_secondary=2,
),
DummyConstraintExtractor(),
]
constraints_extractor = ConstraintExtractorPortfolio(
extractors=extractors, weights=[0.8, 0.2]
)
constraint_handler = TasksConstraintHandler(
problem=problem,
neighbor_builder=n,
constraints_extractor=constraints_extractor,
)
solver = LnsOrtoolsCpSat(
problem=problem,
subsolver=subsolver,
constraint_handler=constraint_handler,
)
parameters_cp = ParametersCp.default_cpsat()
parameters_cp.nb_process = 15
res = solver.solve(
callbacks=[WarmStartCallback()],
nb_iteration_lns=30,
time_limit_subsolver=10,
time_limit_subsolver_iter0=10,
parameters_cp=parameters_cp,
skip_initial_solution_provider=True,
ortools_cpsat_solver_kwargs={
"log_search_progress": False,
"fix_variables_to_their_hinted_value": False,
},
)
sol = res.get_best_solution()
problem.satisfy(sol)


if __name__ == "__main__":
run_lns_scheduling()
File renamed without changes.
94 changes: 94 additions & 0 deletions examples/coloring/run_lns_generic.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
# Copyright (c) 2024 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.


import logging

from discrete_optimization.coloring.parser import get_data_available, parse_file
from discrete_optimization.coloring.plot import plot_coloring_solution, plt
from discrete_optimization.coloring.problem import (
ColoringConstraints,
transform_coloring_problem,
)
from discrete_optimization.coloring.solvers.cpsat import (
CpSatColoringSolver,
ModelingCpSat,
)
from discrete_optimization.generic_tasks_tools.solvers.lns_cp.constraint_extractor import (
BaseConstraintExtractor,
ConstraintExtractorPortfolio,
DummyConstraintExtractor,
NbChangesAllocationConstraintExtractor,
NbUsagesAllocationConstraintExtractor,
SubresourcesAllocationConstraintExtractor,
SubtasksAllocationConstraintExtractor,
)
from discrete_optimization.generic_tasks_tools.solvers.lns_cp.constraint_handler import (
TasksConstraintHandler,
)
from discrete_optimization.generic_tools.callbacks.loggers import NbIterationTracker
from discrete_optimization.generic_tools.callbacks.warm_start_callback import (
WarmStartCallback,
)
from discrete_optimization.generic_tools.cp_tools import ParametersCp
from discrete_optimization.generic_tools.lns_cp import LnsOrtoolsCpSat

logging.basicConfig(level=logging.INFO)


def run_lns():
logging.basicConfig(level=logging.INFO)
file = [f for f in get_data_available() if "gc_250_5" in f][0]
color_problem = parse_file(file)
subsolver = CpSatColoringSolver(color_problem, params_objective_function=None)
subsolver.init_model(
modeling=ModelingCpSat.BINARY,
do_warmstart=True,
value_sequence_chain=False,
used_variable=True,
)
p = ParametersCp.default_cpsat()
print("finished initializing")
extractors: list[BaseConstraintExtractor] = [
NbChangesAllocationConstraintExtractor(nb_changes_max=20),
NbUsagesAllocationConstraintExtractor(plus_delta_nb_usages_total=10),
# SubresourcesAllocationConstraintExtractor(frac_random_fixed_unary_resources=0.2),
SubtasksAllocationConstraintExtractor(
fix_secondary_tasks_allocation=False, frac_random_fixed_tasks=0.2
),
DummyConstraintExtractor(),
]
constraints_extractor = ConstraintExtractorPortfolio(
extractors=extractors, weights=[1 / len(extractors)] * len(extractors)
)
# constraints_extractor = ConstraintExtractorList(extractors=extractors)
constraint_handler = TasksConstraintHandler(
problem=color_problem,
constraints_extractor=constraints_extractor,
)
solver = LnsOrtoolsCpSat(
problem=color_problem,
subsolver=subsolver,
constraint_handler=constraint_handler,
)
parameters_cp = ParametersCp.default_cpsat()
parameters_cp.nb_process = 15
res = solver.solve(
callbacks=[WarmStartCallback()],
nb_iteration_lns=30,
time_limit_subsolver=20,
time_limit_subsolver_iter0=20,
parameters_cp=parameters_cp,
skip_initial_solution_provider=True,
ortools_cpsat_solver_kwargs={
"log_search_progress": False,
"fix_variables_to_their_hinted_value": False,
},
)
sol = res.get_best_solution()
print(color_problem.satisfy(sol))


if __name__ == "__main__":
run_lns()
35 changes: 35 additions & 0 deletions examples/facility/run_cpsat.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
# Copyright (c) 2025 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.
import logging
import os.path

from discrete_optimization.facility.parser import get_data_available, parse_file
from discrete_optimization.facility.problem import FacilityProblem, FacilitySolution
from discrete_optimization.facility.solvers.cpsat import CpSatFacilitySolver
from discrete_optimization.generic_tools.cp_tools import ParametersCp

logging.basicConfig(level=logging.INFO)


def cp_facility_example():
file = [f for f in get_data_available() if "fl_200_7" in f][0]
problem: FacilityProblem = parse_file(file)
print("customer : ", problem.customer_count, "facility : ", problem.facility_count)
solver = CpSatFacilitySolver(problem=problem)
print("Initializing...")
solver.init_model()
print("finished initializing")
res = solver.solve(
parameters_cp=ParametersCp.default_cpsat(),
time_limit=100,
ortools_cpsat_solver_kwargs={"log_search_progress": True},
)
sol, fit = res.get_best_solution_fit()
print(problem.evaluate(sol))
print(problem.satisfy(sol))
print(fit)


if __name__ == "__main__":
cp_facility_example()
85 changes: 85 additions & 0 deletions examples/facility/run_lns_generic.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
# Copyright (c) 2025 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.
import logging
import os.path

from discrete_optimization.facility.parser import get_data_available, parse_file
from discrete_optimization.facility.problem import FacilityProblem, FacilitySolution
from discrete_optimization.facility.solvers.cpsat import CpSatFacilitySolver
from discrete_optimization.generic_tasks_tools.solvers.lns_cp.constraint_extractor import (
BaseConstraintExtractor,
ConstraintExtractorList,
ConstraintExtractorPortfolio,
DummyConstraintExtractor,
NbChangesAllocationConstraintExtractor,
NbUsagesAllocationConstraintExtractor,
SubresourcesAllocationConstraintExtractor,
SubtasksAllocationConstraintExtractor,
)
from discrete_optimization.generic_tasks_tools.solvers.lns_cp.constraint_handler import (
TasksConstraintHandler,
)
from discrete_optimization.generic_tools.callbacks.warm_start_callback import (
WarmStartCallback,
WarmStartCallbackLastRun,
)
from discrete_optimization.generic_tools.cp_tools import ParametersCp
from discrete_optimization.generic_tools.lns_cp import LnsOrtoolsCpSat

logging.basicConfig(level=logging.INFO)


def run_lns_cp_facility():
file = [f for f in get_data_available() if "fl_200_6" in f][0]
problem: FacilityProblem = parse_file(file)
print("customer : ", problem.customer_count, "facility : ", problem.facility_count)
subsolver = CpSatFacilitySolver(problem=problem)
print("Initializing...")
subsolver.init_model()
print("finished initializing")
extractors: list[BaseConstraintExtractor] = [
# NbChangesAllocationConstraintExtractor(nb_changes_max=20),
NbUsagesAllocationConstraintExtractor(plus_delta_nb_usages_total=5),
SubresourcesAllocationConstraintExtractor(
frac_random_fixed_unary_resources=0.2
),
SubtasksAllocationConstraintExtractor(
fix_secondary_tasks_allocation=False, frac_random_fixed_tasks=0.2
),
DummyConstraintExtractor(),
]
constraints_extractor = ConstraintExtractorPortfolio(
extractors=extractors, weights=[1 / len(extractors)] * len(extractors)
)

constraint_handler = TasksConstraintHandler(
problem=problem,
constraints_extractor=constraints_extractor,
)

solver = LnsOrtoolsCpSat(
problem=problem,
subsolver=subsolver,
constraint_handler=constraint_handler,
)
parameters_cp = ParametersCp.default_cpsat()
parameters_cp.nb_process = 15
res = solver.solve(
callbacks=[WarmStartCallback()],
nb_iteration_lns=30,
time_limit_subsolver=10,
time_limit_subsolver_iter0=20,
parameters_cp=parameters_cp,
skip_initial_solution_provider=True,
ortools_cpsat_solver_kwargs={
"log_search_progress": False,
"fix_variables_to_their_hinted_value": False,
},
)
sol = res.get_best_solution()
problem.satisfy(sol)


if __name__ == "__main__":
run_lns_cp_facility()
Loading
Loading