From a1bf254d6b2aa228b8c1a92b0140156dab922dfa Mon Sep 17 00:00:00 2001 From: Simon Pierre Date: Tue, 15 Oct 2024 16:20:05 +0200 Subject: [PATCH] added optional t_out penalization --- src/cpagent/cp_agent.py | 1 + src/cpagent/objectives.py | 3 +++ tests/cpagent/test_solvers.py | 22 ++++++++++++++++++++++ 3 files changed, 26 insertions(+) diff --git a/src/cpagent/cp_agent.py b/src/cpagent/cp_agent.py index fe14d47..a9de431 100644 --- a/src/cpagent/cp_agent.py +++ b/src/cpagent/cp_agent.py @@ -44,6 +44,7 @@ class CpAgent(SchedulerAgent): max_optimization_time = SOLVER_TIMEOUT save_history = False itinierary_setup = 120 + penalize_t_out = False # solution diff --git a/src/cpagent/objectives.py b/src/cpagent/objectives.py index 7911a1a..cd5c2da 100644 --- a/src/cpagent/objectives.py +++ b/src/cpagent/objectives.py @@ -15,5 +15,8 @@ def _create_objective( model.Minimize(sum([ (self.t_in[i] - step['min_t_in']) * step['ponderation'] + + + ((self.t_out[i] - step['min_t_out']) + * step['ponderation'] if self.penalize_t_out else 0.) for i, step in enumerate(self.steps) ])) diff --git a/tests/cpagent/test_solvers.py b/tests/cpagent/test_solvers.py index 1045cfe..18c14b9 100644 --- a/tests/cpagent/test_solvers.py +++ b/tests/cpagent/test_solvers.py @@ -45,6 +45,28 @@ def test_solver_simple(solver, use_case_straight_line_2t): assert cp_solver.Values(solver.t_out).to_list() == t_out_oracle +@pytest.mark.parametrize("solver", [ + CpAgent("ortools") +]) +def test_solver_simple_penalize_t_out(solver, use_case_straight_line_2t): + """Testing solver on a simple use case with + t_out penalization + """ + solver.penalize_t_out = True + cp_solver, _ = solver._solve_from_steps( + use_case_straight_line_2t[0], + use_case_straight_line_2t[1], + use_case_straight_line_2t[2] + ) + cp_solver.Values(solver.t_in).to_list() + cost_oracle = 40 + t_in_oracle = [0, 10, 10, 30] + t_out_oracle = [10, 30, 30, 40] + assert int(cp_solver.ObjectiveValue()) == cost_oracle + assert cp_solver.Values(solver.t_in).to_list() == t_in_oracle + assert cp_solver.Values(solver.t_out).to_list() == t_out_oracle + + @pytest.mark.parametrize("solver", [ CpAgent("ortools") ])