Skip to content
Merged
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
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
)
Expand Down
3 changes: 3 additions & 0 deletions ext/or-tools/routing.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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"};
}
Expand Down
30 changes: 6 additions & 24 deletions test/routing_solution_trace_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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(
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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

Expand Down