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
7 changes: 3 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -1490,10 +1490,9 @@ A subsequent solve uses the time limit in its own search parameters.
Native improvement-rate stopping is available through search parameters:

```ruby
search_parameters.improvement_limit_parameters = {
improvement_rate_coefficient: 0.01,
improvement_rate_solutions_distance: 5
}
limits = search_parameters.improvement_limit_parameters
limits.improvement_rate_coefficient = 0.01
limits.improvement_rate_solutions_distance = 5
```

Piecewise linear costs can be applied to dimension cumul variables:
Expand Down
33 changes: 7 additions & 26 deletions ext/or-tools/routing.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -354,6 +354,12 @@ void init_routing(Rice::Module& m) {

m.define_singleton_function("default_routing_search_parameters", &DefaultRoutingSearchParameters);

Rice::define_class_under<RoutingSearchParameters::ImprovementSearchLimitParameters>(rb_cRoutingSearchParameters, "ImprovementSearchLimitParameters")
.define_method("improvement_rate_coefficient", &RoutingSearchParameters::ImprovementSearchLimitParameters::improvement_rate_coefficient)
.define_method("improvement_rate_coefficient=", &RoutingSearchParameters::ImprovementSearchLimitParameters::set_improvement_rate_coefficient)
.define_method("improvement_rate_solutions_distance", &RoutingSearchParameters::ImprovementSearchLimitParameters::improvement_rate_solutions_distance)
.define_method("improvement_rate_solutions_distance=", &RoutingSearchParameters::ImprovementSearchLimitParameters::set_improvement_rate_solutions_distance);

rb_cRoutingSearchParameters
.define_method("christofides_use_minimum_matching", &RoutingSearchParameters::christofides_use_minimum_matching)
.define_method("christofides_use_minimum_matching=", &RoutingSearchParameters::set_christofides_use_minimum_matching)
Expand Down Expand Up @@ -475,6 +481,7 @@ void init_routing(Rice::Module& m) {

return self.set_local_search_metaheuristic(v);
})
.define_method("improvement_limit_parameters", &RoutingSearchParameters::mutable_improvement_limit_parameters, Rice::Return().keepAlive())
.define_method(
"time_limit=",
[](RoutingSearchParameters& self, int64_t value) {
Expand All @@ -484,32 +491,6 @@ void init_routing(Rice::Module& m) {
"lns_time_limit=",
[](RoutingSearchParameters& self, int64_t value) {
self.mutable_lns_time_limit()->set_seconds(value);
})
.define_method(
"improvement_limit_parameters",
[](RoutingSearchParameters& self) -> Object {
if (!self.has_improvement_limit_parameters()) {
return Object(Qnil);
}

const auto& parameters = self.improvement_limit_parameters();
Hash result;
result[Symbol("improvement_rate_coefficient")] =
parameters.improvement_rate_coefficient();
result[Symbol("improvement_rate_solutions_distance")] =
parameters.improvement_rate_solutions_distance();
return result;
})
.define_method(
"improvement_limit_parameters=",
[](RoutingSearchParameters& self, Hash value) {
const double coefficient =
value.get<double>(Symbol("improvement_rate_coefficient"));
const int distance =
value.get<int>(Symbol("improvement_rate_solutions_distance"));
auto* parameters = self.mutable_improvement_limit_parameters();
parameters->set_improvement_rate_coefficient(coefficient);
parameters->set_improvement_rate_solutions_distance(distance);
});

Rice::define_class_under<RoutingIndexManager>(m, "RoutingIndexManager")
Expand Down
37 changes: 23 additions & 14 deletions test/routing_test.rb
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
require_relative "test_helper"
require "weakref"

class RoutingTest < Minitest::Test
# https://developers.google.com/optimization/routing/tsp
Expand Down Expand Up @@ -907,20 +908,28 @@ def test_search_parameters
search_parameters.first_solution_strategy = :path_cheapest_arc
search_parameters.local_search_metaheuristic = :guided_local_search
search_parameters.log_search = true
assert_nil search_parameters.improvement_limit_parameters

search_parameters.improvement_limit_parameters = {
improvement_rate_coefficient: 0.01,
improvement_rate_solutions_distance: 5
}

assert_equal(
{
improvement_rate_coefficient: 0.01,
improvement_rate_solutions_distance: 5
},
search_parameters.improvement_limit_parameters
)

assert_equal 0, search_parameters.improvement_limit_parameters.improvement_rate_coefficient
search_parameters.improvement_limit_parameters.improvement_rate_coefficient = 0.5
assert_equal 0.5, search_parameters.improvement_limit_parameters.improvement_rate_coefficient

assert_equal 0, search_parameters.improvement_limit_parameters.improvement_rate_solutions_distance
search_parameters.improvement_limit_parameters.improvement_rate_solutions_distance = 1
assert_equal 1, search_parameters.improvement_limit_parameters.improvement_rate_solutions_distance
end

def test_improvement_parameters_retain_search_parameters
search_parameters = ORTools.default_routing_search_parameters
parent = WeakRef.new(search_parameters)
limits = search_parameters.improvement_limit_parameters
search_parameters = nil
3.times { GC.start }

assert parent.weakref_alive?
limits.improvement_rate_coefficient = 0.5
limits.improvement_rate_solutions_distance = 1
assert_equal 0.5, limits.improvement_rate_coefficient
assert_equal 1, limits.improvement_rate_solutions_distance
end

def test_set_allowed_vehicles_for_index
Expand Down
Loading