diff --git a/README.md b/README.md index de194f8..959ddeb 100644 --- a/README.md +++ b/README.md @@ -1487,7 +1487,7 @@ Piecewise linear costs can be applied to dimension cumul variables: ```ruby time_dimension.set_cumul_var_piecewise_linear_cost( routing.end(vehicle_id), - 0, # cost at the first breakpoint + 0, # cost at zero [shift_end, limit], # breakpoints [0, 50, 200] # one slope per segment ) diff --git a/ext/or-tools/routing.cpp b/ext/or-tools/routing.cpp index d606e99..5c8dafd 100644 --- a/ext/or-tools/routing.cpp +++ b/ext/or-tools/routing.cpp @@ -710,6 +710,9 @@ void init_routing(Rice::Module& m) { if (max_samples <= 0) { throw std::invalid_argument{"max_samples must be positive"}; } + if (max_samples > 100000) { + throw std::invalid_argument{"max_samples must be at most 100000"}; + } if (sample_interval_ms <= 0) { throw std::invalid_argument{"sample_interval_ms must be positive"}; } diff --git a/test/routing_solution_trace_test.rb b/test/routing_solution_trace_test.rb index 4d6a95a..62260bb 100644 --- a/test/routing_solution_trace_test.rb +++ b/test/routing_solution_trace_test.rb @@ -101,28 +101,6 @@ def test_keeps_aggregates_after_samples_are_truncated assert_operator values[:improvement_count], :>, 1 end - def test_native_improvement_limit_stops_search - baseline_routing = build_routing - baseline_trace = baseline_routing.enable_solution_trace - baseline_routing.solve_with_parameters(search_parameters(solution_limit: 500)) - - routing = build_routing - trace = routing.enable_solution_trace - solution = routing.solve_with_parameters( - search_parameters( - solution_limit: 500, - improvement_limit_parameters: { - improvement_rate_coefficient: 0.01, - improvement_rate_solutions_distance: 1 - } - ) - ) - - assert_equal 500, baseline_trace.to_h[:solution_count] - assert_operator trace.to_h[:solution_count], :<, 500 - assert_equal solution.objective_value, trace.to_h[:best_solution_objective] - end - def test_resets_for_warm_solves routing = build_routing trace = routing.enable_solution_trace( @@ -189,6 +167,11 @@ def test_validates_and_reuses_configuration end assert_equal "max_samples must be positive", error.message + error = assert_raises(ArgumentError) do + routing.enable_solution_trace(max_samples: 100001) + end + assert_equal "max_samples must be at most 100000", error.message + error = assert_raises(ArgumentError) do routing.enable_solution_trace(sample_interval_ms: 0) end @@ -261,13 +244,12 @@ def build_routing routing end - def search_parameters(solution_limit: nil, time_limit: nil, improvement_limit_parameters: nil) + def search_parameters(solution_limit: nil, time_limit: nil) parameters = ORTools.default_routing_search_parameters parameters.first_solution_strategy = :path_cheapest_arc parameters.local_search_metaheuristic = :guided_local_search parameters.solution_limit = solution_limit if solution_limit parameters.time_limit = time_limit if time_limit - parameters.improvement_limit_parameters = improvement_limit_parameters if improvement_limit_parameters parameters end