google / or-tools

Google's Operations Research tools:
https://developers.google.com/optimization/
Apache License 2.0
11.24k stars 2.13k forks source link

SegFault PickUp/Delivery #337

Closed braktar closed 7 years ago

braktar commented 7 years ago

I'm currently using the routing library.

Using some hints from the discussion forum : https://groups.google.com/forum/#!searchin/or-tools-discuss/negative$20capacity|sort:relevance/or-tools-discuss/NeClqCYwD6E/jIN2VXU--l0J

The current use is a CVRP with some pickup activities(positive quantities) and deliver some others(negative quantities). It works quite well but a SegFault occurs when most of the quantities are bigger than the half of the vehicle capacity.

furnon commented 7 years ago

That's strange. What language/platform are you using ? Can you share some code to reproduce it ?

On Wed, Mar 8, 2017 at 6:57 PM, Gwénaël Rault notifications@github.com wrote:

I'm currently using the routing library.

Using some hints from the discussion forum : https://groups.google.com/forum/#!searchin/or-tools- discuss/negative$20capacity|sort:relevance/or-tools- discuss/NeClqCYwD6E/jIN2VXU--l0J

The current use is a CVRP with some pickup activities(positive quantities) and deliver some others(negative quantities). It works quite well but a SegFault occurs when most of the quantities are bigger than the half of the vehicle capacity.

— You are receiving this because you are subscribed to this thread. Reply to this email directly, view it on GitHub https://github.com/google/or-tools/issues/337, or mute the thread https://github.com/notifications/unsubscribe-auth/AKjyUr4ygYihPEWWkCHYga8-2DcYAiCpks5rjuvygaJpZM4MXGs_ .

braktar commented 7 years ago

Our tool is based on ruby and call OR-tools with a C++ interface (based on an old tutorial : Chapter 9) through protobuf.

The easiest way to reproduce it will be to setup our API : https://github.com/Mapotempo/optimizer-api/tree/deliveries And the wrapper to OR-tools https://github.com/Mapotempo/optimizer-ortools/tree/deliveries

And then call the test case which fails https://github.com/Mapotempo/optimizer-api/commit/a02dd8fe33aedf45a704085377ae30a6a5f85bd9

APP_ENV=test bundle exec rake test TEST=test/wrappers/ortools_test.rb

furnon commented 7 years ago

Do you happen to have a stack trace when the SegFault occurs ?

On Thu, Mar 9, 2017 at 10:31 AM, Gwénaël Rault notifications@github.com wrote:

Our tool is based on ruby and call OR-tools with a C++ interface (based on an old tutorial : Chapter 9) through protobuf.

The easiest way to reproduce it will be to setup our API : https://github.com/Mapotempo/optimizer-api/tree/deliveries And the wrapper to OR-tools https://github.com/Mapotempo/optimizer-ortools/tree/deliveries

And then call the test case which fails Mapotempo/optimizer-api@a02dd8f https://github.com/Mapotempo/optimizer-api/commit/a02dd8fe33aedf45a704085377ae30a6a5f85bd9

APP_ENV=test bundle exec rake test TEST=test/wrappers/ortools_test.rb

— You are receiving this because you commented. Reply to this email directly, view it on GitHub https://github.com/google/or-tools/issues/337#issuecomment-285300737, or mute the thread https://github.com/notifications/unsubscribe-auth/AKjyUkAgtZDxHUZYI8Jb9G-MgKErnh3Dks5rj8bqgaJpZM4MXGs_ .

braktar commented 7 years ago

using the routing_trace flag, I got :

test - [11:34:06] src/constraint_solver/search.cc:240: Start search (memory used = 9.60 MB) test - [11:34:06] src/constraint_solver/search.cc:240: Root node processed (time = 0 ms, constraints = 107, memory used = 9.60 MB) test - Segmentation fault (core dumped)

furnon commented 7 years ago

Can you get a stack trace from the core which was dumped ?

On Thu, Mar 9, 2017 at 11:36 AM, Gwénaël Rault notifications@github.com wrote:

using the routing_trace flag, I got :

test - [11:34:06] src/constraint_solver/search.cc:240: Start search (memory used = 9.60 MB) test - [11:34:06] src/constraint_solver/search.cc:240: Root node processed (time = 0 ms, constraints = 107, memory used = 9.60 MB) test - Segmentation fault (core dumped)

— You are receiving this because you commented. Reply to this email directly, view it on GitHub https://github.com/google/or-tools/issues/337#issuecomment-285316240, or mute the thread https://github.com/notifications/unsubscribe-auth/AKjyUnKbfjFk5pD7GEgfZFcoC663y3SEks5rj9YegaJpZM4MXGs_ .

braktar commented 7 years ago
(gdb) run
Starting program: /home/gwenael/optimizer-ortools/tsp_simple -time_limit_in_ms 100 -nearby -instance_file optimize-or-tools-input
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".

Program received signal SIGSEGV, Segmentation fault.
0x00007ffff73dca97 in operations_research::RouteConstructor::CheckTempAssignment(operations_research::Assignment*, int, int, int, int, int, int) () from ../or-tools/lib/libortools.so
(gdb) bt full
#0  0x00007ffff73dca97 in operations_research::RouteConstructor::CheckTempAssignment(operations_research::Assignment*, int, int, int, int, int, int) () from ../or-tools/lib/libortools.so
No symbol table info available.
#1  0x00007ffff73eadde in operations_research::RouteConstructor::Construct() () from ../or-tools/lib/libortools.so
No symbol table info available.
#2  0x00007ffff73eed16 in operations_research::SavingsBuilder::Next(operations_research::Solver*) () from ../or-tools/lib/libortools.so
No symbol table info available.
#3  0x00007ffff742880c in operations_research::(anonymous namespace)::ComposeDecisionBuilder::Next(operations_research::Solver*) () from ../or-tools/lib/libortools.so
No symbol table info available.
#4  0x00007ffff7281945 in operations_research::Solver::NextSolution() () from ../or-tools/lib/libortools.so
No symbol table info available.
#5  0x00007ffff7282aff in operations_research::Solver::SolveAndCommit(operations_research::DecisionBuilder*, std::vector<operations_research::SearchMonitor*, std::allocator<operations_research::SearchMonitor*> > const&) () from ../or-tools/lib/libortools.so
No symbol table info available.
#6  0x00007ffff7360487 in operations_research::(anonymous namespace)::NestedSolveDecision::Apply(operations_research::Solver*) () from ../or-tools/lib/libortools.so
No symbol table info available.
#7  0x00007ffff7281ace in operations_research::Solver::NextSolution() () from ../or-tools/lib/libortools.so
No symbol table info available.
#8  0x00007ffff7282068 in operations_research::Solver::Solve(operations_research::DecisionBuilder*, std::vector<operations_research::SearchMonitor*, std::allocator<operations_research::SearchMonitor*> > const&) () from ../or-tools/lib/libortools.so
No symbol table info available.
#9  0x00007ffff73d2556 in operations_research::RoutingModel::SolveFromAssignmentWithParameters(operations_research::Assignment const*, operations_research::RoutingSearchParameters const&) ()
   from ../or-tools/lib/libortools.so
No symbol table info available.
#10 0x00000000004117ed in operations_research::TSPTWSolver (data=...) at tsp_simple.cc:377
        size_vehicles = <optimized out>
        size_mtws = 0
        has_lateness = <optimized out>
        start_ends = <optimized out>
        routing = {static kFirstNode = {value_ = 0}, static kInvalidNodeIndex = {value_ = -1}, static kNoDisjunction = {value_ = -1}, static kNoDimension = {value_ = -1}, 
          static kCostClassIndexOfZeroCost = {value_ = 0}, solver_ = std::unique_ptr<operations_research::Solver> containing 0x662060, nodes_ = 8, vehicles_ = 1, no_cycle_constraint_ = 0x899830, 
          nexts_ = std::vector of length 7, capacity 8 = {0x88ff50, 0x8900e0, 0x890270, 0x890410, 0x890580, 0x890740, 0x8908b0}, vehicle_vars_ = std::vector of length 8, capacity 8 = {0x8903e0, 
            0x890d40, 0x890eb0, 0x891130, 0x891280, 0x65bfb0, 0x891540, 0x891690}, active_ = std::vector of length 7, capacity 8 = {0x891730, 0x8917e0, 0x891890, 0x891970, 0x891a20, 0x891b20, 0x891bd0}, 
          is_bound_to_end_ = std::vector of length 8, capacity 8 = {0x891c80, 0x891d30, 0x891de0, 0x891e90, 0x891f40, 0x892040, 0x8920f0, 0x8921a0}, is_bound_to_end_ct_added_ = {value_ = false}, 
          dimension_name_to_index_ = {_M_ht = {
              _M_node_allocator = {<__gnu_cxx::new_allocator<__gnu_cxx::_Hashtable_node<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, IntType<operations_research::_RoutingModel_DimensionIndex_tag_, int> > > >> = {<No data fields>}, <No data fields>}, _M_hash = {<No data fields>}, 
              _M_equals = {<std::binary_function<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, bool>> = {<No data fields>}, <No data fields>}, 
              _M_get_key = {<std::unary_function<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, IntType<operations_research::_RoutingModel_DimensionIndex_tag_, int> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const>> = {<No data fields>}, <No data fields>}, _M_buckets = std::vector of length 193, capacity 193 = {
                0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 
                0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 
                0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 
                0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x897480, 0x0, 0x88fc30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x893a50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 
                0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x89c310, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 
                0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x89e920, 0x0, 0x0}, _M_num_elements = 5}}, 
          dimensions_ = {<std::vector<operations_research::RoutingDimension*, std::allocator<operations_research::RoutingDimension*> >> = std::vector of length 5, capacity 8 = {0x88f9c0, 0x897210, 
              0x899ca0, 0x89c0a0, 0x89e6b0}, <No data fields>}, primary_constrained_dimension_ = "", cost_ = 0x8a9210, transit_cost_of_vehicle_ = std::vector of length 1, capacity 1 = {0x0}, 
          fixed_cost_of_vehicle_ = std::vector of length 1, capacity 1 = {0}, cost_class_index_of_vehicle_ = std::vector of length 1, capacity 1 = {{value_ = 1}}, 
          cost_classes_ = {<std::vector<operations_research::RoutingModel::CostClass, std::allocator<operations_research::RoutingModel::CostClass> >> = std::vector of length 2, capacity 2 = {{
                arc_cost_evaluator = 0x8a2670, dimension_transit_evaluator_class_and_cost_coefficient = std::vector of length 0, capacity 0}, {arc_cost_evaluator = 0x8a2670, 
                dimension_transit_evaluator_class_and_cost_coefficient = std::vector of length 2, capacity 2 = {{transit_evaluator_class = 0, cost_coefficient = 200, dimension = 0x899ca0}, {
                    transit_evaluator_class = 0, cost_coefficient = 1000, dimension = 0x88f9c0}}}}, <No data fields>}, costs_are_homogeneous_across_vehicles_ = true, cache_callbacks_ = false, 
          cost_cache_ = std::vector of length 8, capacity 8 = {{index = 2, cost_class_index = {value_ = 1}, cost = 0}, {index = 6, cost_class_index = {value_ = 1}, cost = 0}, {index = 7, 
              cost_class_index = {value_ = 1}, cost = 0}, {index = 6, cost_class_index = {value_ = 1}, cost = 0}, {index = 6, cost_class_index = {value_ = 1}, cost = 0}, {index = 6, cost_class_index = {
                value_ = 1}, cost = 0}, {index = 0, cost_class_index = {value_ = 1}, cost = 0}, {index = 6, cost_class_index = {value_ = 1}, cost = 0}}, 
          vehicle_class_index_of_vehicle_ = std::vector of length 1, capacity 1 = {{value_ = 0}}, 
          vehicle_classes_ = {<std::vector<operations_research::RoutingModel::VehicleClass, std::allocator<operations_research::RoutingModel::VehicleClass> >> = std::vector of length 1, capacity 1 = {{
                cost_class_index = {value_ = 1}, fixed_cost = 0, start = {value_ = 6}, end = {value_ = 7}, 
---Type <return> to continue, or q <return> to quit---
                dimension_start_cumuls_min = {<std::vector<long long, std::allocator<long long> >> = std::vector of length 5, capacity 5 = {0, 0, 0, 0, 0}, <No data fields>}, 
                dimension_start_cumuls_max = {<std::vector<long long, std::allocator<long long> >> = std::vector of length 5, capacity 5 = {4611686018427387904, 0, 0, 0, 10000}, <No data fields>}, 
                dimension_end_cumuls_min = {<std::vector<long long, std::allocator<long long> >> = std::vector of length 5, capacity 5 = {0, 0, 0, 0, 0}, <No data fields>}, 
                dimension_end_cumuls_max = {<std::vector<long long, std::allocator<long long> >> = std::vector of length 5, capacity 5 = {214748364700, 9223372036854775807, 9223372036854775807, 
                    9223372036854775807, 10000}, <No data fields>}, dimension_capacities = {<std::vector<long long, std::allocator<long long> >> = std::vector of length 5, capacity 5 = {
                    4611686018427387904, 9223372036854775807, 9223372036854775807, 9223372036854775807, 10000}, <No data fields>}, 
                dimension_evaluator_classes = {<std::vector<long long, std::allocator<long long> >> = std::vector of length 5, capacity 5 = {0, 0, 0, 0, 0}, <No data fields>}, 
                unvisitable_nodes_fprint = 18242355253403408681}}, <No data fields>}, 
          vehicle_start_class_callback_ = {<std::_Maybe_unary_or_binary_function<int, long long>> = {<std::unary_function<long long, int>> = {<No data fields>}, <No data fields>}, <std::_Function_base> = {static _M_max_size = 16, static _M_max_align = 8, _M_functor = {_M_unused = {_M_object = 0x7fffffffd570, _M_const_object = 0x7fffffffd570, _M_function_pointer = 0x7fffffffd570, 
                  _M_member_pointer = (void (std::_Undefined_class::*)(std::_Undefined_class * const)) 0x7fffffffd570, this adjustment 1}, 
                _M_pod_data = "p\325\377\377\377\177\000\000\001\000\000\000\000\000\000"}, 
              _M_manager = 0x7ffff73b0f70 <std::_Function_base::_Base_manager<operations_research::RoutingModel::CloseModelWithParameters(operations_research::RoutingSearchParameters const&)::{lambda(long long)#1}>::_M_manager(std::_Any_data&, std::_Function_base::_Base_manager<operations_research::RoutingModel::CloseModelWithParameters(operations_research::RoutingSearchParameters const&)::{lambda(long long)#1}> const&, std::_Manager_operation)>}, 
            _M_invoker = 0x7ffff73b8200 <std::_Function_handler<int (long long), operations_research::RoutingModel::CloseModelWithParameters(operations_research::RoutingSearchParameters const&)::{lambda(long long)#1}>::_M_invoke(std::_Any_data const&, long long&&)>}, cached_node_callbacks_ = {_M_ht = {
              _M_node_allocator = {<__gnu_cxx::new_allocator<__gnu_cxx::_Hashtable_node<std::pair<ResultCallback2<long long, IntType<operations_research::_RoutingModel_NodeIndex_tag_, int>, IntType<operations_research::_RoutingModel_NodeIndex_tag_, int> > const* const, ResultCallback2<long long, IntType<operations_research::_RoutingModel_NodeIndex_tag_, int>, IntType<operations_research::_RoutingModel_NodeIndex_tag_, int> >*> > >> = {<No data fields>}, <No data fields>}, _M_hash = {<No data fields>}, 
              _M_equals = {<std::binary_function<ResultCallback2<long long, IntType<operations_research::_RoutingModel_NodeIndex_tag_, int>, IntType<operations_research::_RoutingModel_NodeIndex_tag_, int> > const*, ResultCallback2<long long, IntType<operations_research::_RoutingModel_NodeIndex_tag_, int>, IntType<operations_research::_RoutingModel_NodeIndex_tag_, int> > const*, bool>> = {<No data fields>}, <No data fields>}, 
              _M_get_key = {<std::unary_function<std::pair<ResultCallback2<long long, IntType<operations_research::_RoutingModel_NodeIndex_tag_, int>, IntType<operations_research::_RoutingModel_NodeIndex_tag_, int> > const* const, ResultCallback2<long long, IntType<operations_research::_RoutingModel_NodeIndex_tag_, int>, IntType<operations_research::_RoutingModel_NodeIndex_tag_, int> >*>, ResultCallback2<long long, IntType<operations_research::_RoutingModel_NodeIndex_tag_, int>, IntType<operations_research::_RoutingModel_NodeIndex_tag_, int> > const* const>> = {<No data fields>}, <No data fields>}, 
              _M_buckets = std::vector of length 193, capacity 193 = {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 
                0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 
                0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 
                0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 
                0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 
                0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, _M_num_elements = 0}}, cached_state_dependent_callbacks_ = {_M_ht = {
              _M_node_allocator = {<__gnu_cxx::new_allocator<__gnu_cxx::_Hashtable_node<std::pair<ResultCallback2<operations_research::RoutingModel::StateDependentTransit, IntType<operations_research::_RoutingModel_NodeIndex_tag_, int>, IntType<operations_research::_RoutingModel_NodeIndex_tag_, int> > const* const, ResultCallback2<operations_research::RoutingModel::StateDependentTransit, IntType<operations_research::_RoutingModel_NodeIndex_tag_, int>, IntType<operations_research::_RoutingModel_NodeIndex_tag_, int> >*> > >> = {<No data fields>}, <No data fields>}, _M_hash = {<No data fields>}, 
              _M_equals = {<std::binary_function<ResultCallback2<operations_research::RoutingModel::StateDependentTransit, IntType<operations_research::_RoutingModel_NodeIndex_tag_, int>, IntType<operations_research::_RoutingModel_NodeIndex_tag_, int> > const*, ResultCallback2<operations_research::RoutingModel::StateDependentTransit, IntType<operations_research::_RoutingModel_NodeIndex_tag_, int>, IntType<operations_research::_RoutingModel_NodeIndex_tag_, int> > const*, bool>> = {<No data fields>}, <No data fields>}, 
              _M_get_key = {<std::unary_function<std::pair<ResultCallback2<operations_research::RoutingModel::StateDependentTransit, IntType<operations_research::_RoutingModel_NodeIndex_tag_, int>, IntType<operations_research::_RoutingModel_NodeIndex_tag_, int> > const* const, ResultCallback2<operations_research::RoutingModel::StateDependentTransit, IntType<operations_research::_RoutingModel_NodeIndex_tag_, int>, IntType<operations_research::_RoutingModel_NodeIndex_tag_, int> >*>, ResultCallback2<operations_research::RoutingModel::StateDependentTransit, IntType<operations_research::_RoutingModel_NodeIndex_tag_, int>, IntType<operations_research::_RoutingModel_NodeIndex_tag_, int> > const* const>> = {<No data fields>}, <No data fields>}, _M_buckets = std::vector of length 193, capacity 193 = {0x0, 0x0, 
                0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 
                0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 
                0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 
                0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 
                0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 
                0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, _M_num_elements = 0}}, 
          disjunctions_ = {<std::vector<operations_research::RoutingModel::ValuedNodes<operations_research::RoutingModel::DisjunctionValues>, std::allocator<operations_research::RoutingModel::ValuedNodes<operations_research::RoutingModel::DisjunctionValues> > >> = std::vector of length 6, capacity 8 = {{nodes = std::vector of length 1, capacity 1 = {0}, value = {penalty = 0, max_cardinality = 1}}, {
                nodes = std::vector of length 1, capacity 1 = {1}, value = {penalty = 0, max_cardinality = 1}}, {nodes = std::vector of length 1, capacity 1 = {2}, value = {penalty = 0, 
                  max_cardinality = 1}}, {nodes = std::vector of length 1, capacity 1 = {3}, value = {penalty = 0, max_cardinality = 1}}, {nodes = std::vector of length 1, capacity 1 = {4}, value = {
                  penalty = 0, max_cardinality = 1}}, {nodes = std::vector of length 1, capacity 1 = {5}, value = {penalty = 0, max_cardinality = 1}}}, <No data fields>}, 
          node_to_disjunctions_ = std::vector of length 8, capacity 8 = {std::vector of length 1, capacity 1 = {{value_ = 0}}, std::vector of length 1, capacity 1 = {{value_ = 1}}, 
            std::vector of length 1, capacity 1 = {{value_ = 2}}, std::vector of length 1, capacity 1 = {{value_ = 3}}, std::vector of length 1, capacity 1 = {{value_ = 4}}, 
            std::vector of length 1, capacity 1 = {{value_ = 5}}, std::vector of length 0, capacity 0, std::vector of length 0, capacity 0}, same_vehicle_costs_ = warning: Type size unknown, assuming 1. Try casting to a known type, or void *.
warning: Type size unknown, assuming 1. Try casting to a known type, or void *.
std::vector of length 0, capacity 0, 
          pickup_delivery_pairs_ = std::vector of length 0, capacity 0, same_vehicle_group_ = std::vector of length 7, capacity 7 = {0, 1, 2, 3, 4, 5, 6}, 
          same_vehicle_groups_ = std::vector of length 7, capacity 7 = {std::vector of length 1, capacity 1 = {0}, std::vector of length 1, capacity 1 = {1}, std::vector of length 1, capacity 1 = {2}, 
            std::vector of length 1, capacity 1 = {3}, std::vector of length 1, capacity 1 = {4}, std::vector of length 1, capacity 1 = {5}, std::vector of length 1, capacity 1 = {6}}, 
---Type <return> to continue, or q <return> to quit---
          index_to_node_ = std::vector of length 8, capacity 8 = {{value_ = 0}, {value_ = 1}, {value_ = 2}, {value_ = 3}, {value_ = 4}, {value_ = 5}, {value_ = 6}, {value_ = 7}}, 
          node_to_index_ = {<std::vector<int, std::allocator<int> >> = std::vector of length 8, capacity 8 = {0, 1, 2, 3, 4, 5, 6, -1}, <No data fields>}, 
          index_to_vehicle_ = std::vector of length 8, capacity 8 = {-1, -1, -1, -1, -1, -1, 0, 0}, starts_ = std::vector of length 1, capacity 1 = {6}, ends_ = std::vector of length 1, capacity 1 = {
            7}, start_end_count_ = 2, closed_ = true, status_ = operations_research::RoutingModel::ROUTING_NOT_SOLVED, first_solution_decision_builders_ = std::vector of length 14, capacity 14 = {
            0x8b5cc0, 0x8b5820, 0x8b4280, 0x8b5cc0, 0x8bd820, 0x0, 0x8bd860, 0x8c85a0, 0x8cc250, 0x8cff20, 0x8d3c70, 0x8d3db0, 0x8afbc0, 0x8d3e10}, 
          first_solution_filtered_decision_builders_ = std::vector of length 14, capacity 14 = {0x0, 0x0, 0x0, 0x0, 0x8b9bd0, 0x0, 0x0, 0x0, 0x8c8630, 0x8cc300, 0x8cffa0, 0x0, 0x0, 0x0}, 
          first_solution_evaluator_ = {<std::_Maybe_unary_or_binary_function<long long, long long, long long>> = {<std::binary_function<long long, long long, long long>> = {<No data fields>}, <No data fields>}, <std::_Function_base> = {static _M_max_size = 16, static _M_max_align = 8, _M_functor = {_M_unused = {_M_object = 0x7fffffffd8d0, _M_const_object = 0x7fffffffd8d0, 
                  _M_function_pointer = 0x7fffffffd8d0, _M_member_pointer = (void (std::_Undefined_class::*)(std::_Undefined_class * const)) 0x7fffffffd8d0}, 
                _M_pod_data = "\320\330\377\377\377\177\000\000\000\000\000\000\000\000\000"}, _M_manager = 0x0}, _M_invoker = 0x0}, local_search_operators_ = std::vector of length 20, capacity 20 = {
            0x8ac780, 0x8acf60, 0x8ad1e0, 0x8ae440, 0x8ae7f0, 0x0, 0x8aebc0, 0x8afbf0, 0x8b1220, 0x8b2600, 0x8b1310, 0x8b16c0, 0x8b1a90, 0x8b1e60, 0x8b2230, 0x8ae350, 0x8b3480, 0x8b3860, 0x8b2ae0, 
            0x8b3c40}, monitors_ = std::vector of length 4, capacity 4 = {0x8c2ef0, 0x8e09f0, 0x8e40d0, 0x8a8290}, collect_assignments_ = 0x8e40d0, solve_db_ = 0x8dbf60, improve_db_ = 0x8df0a0, 
          restore_assignment_ = 0x8e07d0, assignment_ = 0x8c2fe0, preassignment_ = 0x8922e0, extra_vars_ = std::vector of length 0, capacity 0, extra_intervals_ = std::vector of length 0, capacity 0, 
          extra_operators_ = std::vector of length 0, capacity 0, filters_ = std::vector of length 9, capacity 9 = {0x8c22b0, 0x8c25a0, 0x8c1ff0, 0x8c25e0, 0x8c17e0, 0x8c1040, 0x8c0120, 0x8bf940, 
            0x8a3730}, feasibility_filters_ = std::vector of length 8, capacity 8 = {0x8b5e80, 0x8b6db0, 0x8b7590, 0x8b84b0, 0x8b8c50, 0x8b9460, 0x8b9720, 0x8b9740}, 
          extra_filters_ = std::vector of length 0, capacity 0, variables_maximized_by_finalizer_ = std::vector of length 2, capacity 2 = {0x890ee0, 0x89a790}, 
          variables_minimized_by_finalizer_ = std::vector of length 16, capacity 16 = {0x893b90, 0x894100, 0x894bc0, 0x895100, 0x895610, 0x895b60, 0x896090, 0x8965c0, 0x89a900, 0x661c50, 0x661c50, 
            0x661c50, 0x661c50, 0x661c50, 0x661c50, 0x661c50}, sweep_arranger_ = std::unique_ptr<operations_research::SweepArranger> containing 0x0, limit_ = 0x8c2ef0, ls_limit_ = 0x8d7a20, 
          lns_limit_ = 0x8a3630, owned_node_callbacks_ = {_M_ht = {
              _M_node_allocator = {<__gnu_cxx::new_allocator<__gnu_cxx::_Hashtable_node<ResultCallback2<long long, IntType<operations_research::_RoutingModel_NodeIndex_tag_, int>, IntType<operations_research::_RoutingModel_NodeIndex_tag_, int> > const*> >> = {<No data fields>}, <No data fields>}, _M_hash = {<No data fields>}, 
              _M_equals = {<std::binary_function<ResultCallback2<long long, IntType<operations_research::_RoutingModel_NodeIndex_tag_, int>, IntType<operations_research::_RoutingModel_NodeIndex_tag_, int> > const*, ResultCallback2<long long, IntType<operations_research::_RoutingModel_NodeIndex_tag_, int>, IntType<operations_research::_RoutingModel_NodeIndex_tag_, int> > const*, bool>> = {<No data fields>}, <No data fields>}, 
              _M_get_key = {<std::unary_function<ResultCallback2<long long, IntType<operations_research::_RoutingModel_NodeIndex_tag_, int>, IntType<operations_research::_RoutingModel_NodeIndex_tag_, int> > const*, ResultCallback2<long long, IntType<operations_research::_RoutingModel_NodeIndex_tag_, int>, IntType<operations_research::_RoutingModel_NodeIndex_tag_, int> > const*>> = {<No data fields>}, <No data fields>}, _M_buckets = std::vector of length 193, capacity 193 = {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x88fc90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 
                0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 
                0x0, 0x0, 0x0, 0x88fc70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 
                0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8974c0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 
                0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x89c350, 0x0, 0x0, 0x0, 0x0, 0x0, 0x89e9b0, 0x0, 
                0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8a2e70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, _M_num_elements = 6}}, owned_state_dependent_callbacks_ = {
            _M_ht = {
              _M_node_allocator = {<__gnu_cxx::new_allocator<__gnu_cxx::_Hashtable_node<ResultCallback2<operations_research::RoutingModel::StateDependentTransit, IntType<operations_research::_RoutingModel_NodeIndex_tag_, int>, IntType<operations_research::_RoutingModel_NodeIndex_tag_, int> > const*> >> = {<No data fields>}, <No data fields>}, _M_hash = {<No data fields>}, 
              _M_equals = {<std::binary_function<ResultCallback2<operations_research::RoutingModel::StateDependentTransit, IntType<operations_research::_RoutingModel_NodeIndex_tag_, int>, IntType<operations_research::_RoutingModel_NodeIndex_tag_, int> > const*, ResultCallback2<operations_research::RoutingModel::StateDependentTransit, IntType<operations_research::_RoutingModel_NodeIndex_tag_, int>, IntType<operations_research::_RoutingModel_NodeIndex_tag_, int> > const*, bool>> = {<No data fields>}, <No data fields>}, 
              _M_get_key = {<std::unary_function<ResultCallback2<operations_research::RoutingModel::StateDependentTransit, IntType<operations_research::_RoutingModel_NodeIndex_tag_, int>, IntType<operations_research::_RoutingModel_NodeIndex_tag_, int> > const*, ResultCallback2<operations_research::RoutingModel::StateDependentTransit, IntType<operations_research::_RoutingModel_NodeIndex_tag_, int>, IntType<operations_research::_RoutingModel_NodeIndex_tag_, int> > const*>> = {<No data fields>}, <No data fields>}, _M_buckets = std::vector of length 193, capacity 193 = {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 
                0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 
                0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 
                0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 
                0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 
                0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 
                0x0}, _M_num_elements = 0}}}
        horizon = <optimized out>
        time_evaluators = std::vector of length 1, capacity 1 = {0x88f900}
        distance_evaluators = std::vector of length 1, capacity 1 = {0x88f930}
        time_order_evaluators = std::vector of length 1, capacity 1 = {0x88f960}
        distance_order_evaluators = std::vector of length 1, capacity 1 = {0x88f990}
        v = <optimized out>
        min_start = 0
        route_nbr = 0
        previous_distance_depot_start = <optimized out>
        previous_distance_depot_end = <optimized out>
        loop_route = <optimized out>
        unique_configuration = <optimized out>
---Type <return> to continue, or q <return> to quit---
        compareNodeIndex = <optimized out>
        previous_vehicle = <optimized out>
        breaks = std::vector of length 0, capacity 0
        parameters = <incomplete type>
        solution = <optimized out>
#11 0x0000000000408ad4 in main (argc=1, argv=0x7fffffffdcf0) at tsp_simple.cc:411
        tsptw_data = {size_ = 8, size_matrix_ = 8, size_rest_ = 0, tsptw_vehicles_ = std::vector of length 1, capacity 1 = {0x65a910}, tsptw_rests_ = std::vector of length 0, capacity 0, 
          tsptw_clients_ = std::vector of length 8, capacity 8 = {{customer_number = 0, matrix_index = 0, ready_time = -4611686018427387904, due_time = 4611686018427387904, service_time = 0, 
              priority = 4, late_multiplier = 0, vehicle_indices = std::vector of length 0, capacity 0, quantities = std::vector of length 1, capacity 1 = {5000}, type = "pickup"}, {customer_number = 1, 
              matrix_index = 1, ready_time = -4611686018427387904, due_time = 4611686018427387904, service_time = 0, priority = 4, late_multiplier = 0, 
              vehicle_indices = std::vector of length 0, capacity 0, quantities = std::vector of length 1, capacity 1 = {6000}, type = "pickup"}, {customer_number = 2, matrix_index = 2, 
              ready_time = -4611686018427387904, due_time = 4611686018427387904, service_time = 0, priority = 4, late_multiplier = 0, vehicle_indices = std::vector of length 0, capacity 0, 
              quantities = std::vector of length 1, capacity 1 = {6000}, type = "delivery"}, {customer_number = 3, matrix_index = 3, ready_time = -4611686018427387904, due_time = 4611686018427387904, 
              service_time = 0, priority = 4, late_multiplier = 0, vehicle_indices = std::vector of length 0, capacity 0, quantities = std::vector of length 1, capacity 1 = {5000}, type = "delivery"}, {
              customer_number = 4, matrix_index = 4, ready_time = -4611686018427387904, due_time = 4611686018427387904, service_time = 0, priority = 4, late_multiplier = 0, 
              vehicle_indices = std::vector of length 0, capacity 0, quantities = std::vector of length 1, capacity 1 = {5000}, type = "delivery"}, {customer_number = 5, matrix_index = 5, 
              ready_time = -4611686018427387904, due_time = 4611686018427387904, service_time = 0, priority = 4, late_multiplier = 0, vehicle_indices = std::vector of length 0, capacity 0, 
              quantities = std::vector of length 1, capacity 1 = {6000}, type = "pickup"}, {customer_number = 6, matrix_index = 6, ready_time = -4611686018427387904, due_time = 4611686018427387904, 
              service_time = 0, priority = 4, late_multiplier = 0, vehicle_indices = std::vector of length 0, capacity 0, quantities = std::vector of length 0, capacity 0, type = ""}, {
              customer_number = 7, matrix_index = 7, ready_time = -4611686018427387904, due_time = 4611686018427387904, service_time = 0, priority = 4, late_multiplier = 0, 
              vehicle_indices = std::vector of length 0, capacity 0, quantities = std::vector of length 0, capacity 0, type = ""}}, details_ = "", horizon_ = 4611686018427387904, max_time_ = 0, 
          max_distance_ = 3, max_time_cost_ = 1000, max_distance_cost_ = 0, max_service_ = 0, max_rest_ = 0, tws_counter_ = 0, multiple_tws_counter_ = 0}
braktar commented 7 years ago

I've completed a bit the trace, but i didn't find out how to trace within the or-tools sources using gdb

furnon commented 7 years ago

It seems you are using "Savings" as first solution heuristic. Does the same model fail if you use another heuristic ?

On Fri, Mar 24, 2017 at 9:54 AM, Gwénaël Rault notifications@github.com wrote:

I've completed a bit the trace, but i can't find out how to trace within the or-tools sources using gdb

— You are receiving this because you commented. Reply to this email directly, view it on GitHub https://github.com/google/or-tools/issues/337#issuecomment-289028580, or mute the thread https://github.com/notifications/unsubscribe-auth/AKjyUpmPVdXhrVaH2OLESCKU-Gr0OJynks5ro8sJgaJpZM4MXGs_ .

braktar commented 7 years ago

It doesn't lead to a SegFault but the solution only contains depots with the following heuristics : local cheapest insertion, parallel cheapest insertion, first inbound min value, best insertion and all unperformed And don't even found a solution with christofides.

test - First solution strategy : Local Cheapest Insertion test - [16:32:46] src/constraint_solver/search.cc:240: Start search (memory used = 9.60 MB) test - [16:32:46] src/constraint_solver/search.cc:240: Root node processed (time = 0 ms, constraints = 107, memory used = 9.60 MB) test - [16:32:46] src/constraint_solver/search.cc:240: Solution #0 (0, time = 0 ms, branches = 83, failures = 35, depth = 33, memory used = 9.60 MB, limit = 0%) test - Iteration : 0 Cost : 0 Time : 0.00077568 test - 6,7; test - Iteration : 1 test - [16:32:46] src/constraint_solver/search.cc:240: Finished search tree (time = 0 ms, branches = 83, failures = 69, memory used = 9.60 MB) test - [16:32:46] src/constraint_solver/search.cc:240: End search (time = 1 ms, branches = 83, failures = 69, memory used = 9.60 MB, speed = 83000 branches/s) test - Final Iteration : 1 Cost : 0 Time : 0.000883968 test - 6,7;

furnon commented 7 years ago

Are your pickup and delivery nodes optional ? (I would suppose so). What kind of penalties do they have ? Do you have enough vehicles to cover the demand ? Are you 100% sure the deliveries have negative demand ? I say that because the problems appear when demand > 1/2 capacity. Are you forcing the cumul at the start node to be 0 when building the demand dimension ? Have you tried relaxing the problem a bit to see what happens ? In particular if you have time windows, what happens if you remove them ? Last, unless the pickup and the deliveries are unrelated, did you call RoutingModel::AddPickupAndDelivery for each pickup/delivery pair?

On Fri, Mar 24, 2017 at 11:09 AM, Gwénaël Rault notifications@github.com wrote:

It doesn't lead to a SegFault but the solution only contains depots with the following heuristics : local cheapest insertion, parallel cheapest insertion, first inbound min value, best insertion and all unperformed And don't even found a solution with christofides.

— You are receiving this because you commented. Reply to this email directly, view it on GitHub https://github.com/google/or-tools/issues/337#issuecomment-289049727, or mute the thread https://github.com/notifications/unsubscribe-auth/AKjyUpg7ph2xXtI-lVjdZATu5ayeoE9oks5ro9ylgaJpZM4MXGs_ .

braktar commented 7 years ago

nodes are optional, the penalty is depending on the problem size, but is quite high regarding the problem. The test problem have no timewindow and no particular constraint except the capacity. The callback give a negative quantity if the node is a delivery and positive if it is pickup.

The problem works, when the cumulated delivery quantities does not exceed the capacity of the vehicle, but the problem is quite trivial

The dimension is not forced to start at zero (which is logical if we want to manage with negative quantities) I tried fixing it, but didn't work neither ;)

The SlackVar is set to zero for every node, because i don't allow to load a half pickup. But even permiting this lead to an empty solution.

And yes, pickup and deliveries are unrelated

furnon commented 7 years ago

Can you share the routing search parameters you are using ? You can display them with DebugString().

On Fri, Mar 24, 2017 at 2:05 PM, Gwénaël Rault notifications@github.com wrote:

nodes are optional, the penalty is depending on the problem size, but is quite high regarding the problem. The test problem have no timewindow and no particular constraint except the capacity. The callback give a negative quantity if the node is a delivery and positive if it is pickup.

The problem works, when the cumulated delivery quantities does not exceed the capacity of the vehicle, but the problem is quite trivial

The dimension is not forced to start at zero (which is logical if we want to manage with negative quantities) I tried fixing it, but didn't work neither ;)

The SlackVar is set to zero for every node, because i don't allow to load a half pickup. But even permiting this lead to an empty solution.

And yes, pickup and deliveries are unrelated

— You are receiving this because you commented. Reply to this email directly, view it on GitHub https://github.com/google/or-tools/issues/337#issuecomment-289101393, or mute the thread https://github.com/notifications/unsubscribe-auth/AKjyUomWiQ8YRklkkBabiVqWvnrFHl00ks5rpAXQgaJpZM4MXGs_ .

furnon commented 7 years ago

I failed to reproduce your issue by handcrafting a model from your description. Do you think you could share a minimal model which exhibits the issue (with just a couple of vehicles and nodes) ?

On Fri, Mar 24, 2017 at 2:57 PM, Vincent Furnon vfurnon@google.com wrote:

Can you share the routing search parameters you are using ? You can display them with DebugString().

On Fri, Mar 24, 2017 at 2:05 PM, Gwénaël Rault notifications@github.com wrote:

nodes are optional, the penalty is depending on the problem size, but is quite high regarding the problem. The test problem have no timewindow and no particular constraint except the capacity. The callback give a negative quantity if the node is a delivery and positive if it is pickup.

The problem works, when the cumulated delivery quantities does not exceed the capacity of the vehicle, but the problem is quite trivial

The dimension is not forced to start at zero (which is logical if we want to manage with negative quantities) I tried fixing it, but didn't work neither ;)

The SlackVar is set to zero for every node, because i don't allow to load a half pickup. But even permiting this lead to an empty solution.

And yes, pickup and deliveries are unrelated

— You are receiving this because you commented. Reply to this email directly, view it on GitHub https://github.com/google/or-tools/issues/337#issuecomment-289101393, or mute the thread https://github.com/notifications/unsubscribe-auth/AKjyUomWiQ8YRklkkBabiVqWvnrFHl00ks5rpAXQgaJpZM4MXGs_ .

braktar commented 7 years ago

The solver debugString :

Solver(name = "Routing", state = OUTSIDE_SEARCH, branches = 83, fails = 69, decisions = 82, delayed demon runs = 20, var demon runs = 286, normal demon runs = 633, Run time = 2 ms)

The solution DebugString : Assignment(time0 (0..4611686018427387904) | time1 (0..4611686018427387904) | time2 (0..4611686018427387904) | time3 (0..4611686018427387904) | time4 (0..4611686018427387904) | time5 (0..4611686018427387904) | time6 (0) | time7 (0) | distance0 (0..9223372036854775807) | distance1 (0..9223372036854775807) | distance2 (0..9223372036854775807) | distance3 (0..9223372036854775807) | distance4 (0..9223372036854775807) | distance5 (0..9223372036854775807) | distance6 (0) | distance7 (0) | time_order0 (0..9223372036854775807) | time_order1 (0..9223372036854775807) | time_order2 (0..9223372036854775807) | time_order3 (0..9223372036854775807) | time_order4 (0..9223372036854775807) | time_order5 (0..9223372036854775807) | time_order6 (0) | time_order7 (0) | distance_order0 (0..9223372036854775807) | distance_order1 (0..9223372036854775807) | distance_order2 (0..9223372036854775807) | distance_order3 (0..9223372036854775807) | distance_order4 (0..9223372036854775807) | distance_order5 (0..9223372036854775807) | distance_order6 (0) | distance_order7 (0) | quantity00 (0..1000) | quantity01 (0..1000) | quantity02 (0..1000) | quantity03 (0..1000) | quantity04 (0..1000) | quantity05 (0..1000) | quantity06 (0..1000) | quantity07 (0..1000) | Nexts0 (0) | Nexts1 (1) | Nexts2 (2) | Nexts3 (3) | Nexts4 (4) | Nexts5 (5) | Nexts6 (7) | Active0 (0) | Active1 (0) | Active2 (0) | Active3 (0) | Active4 (0) | Active5 (0) | Active6 (1) | Vehicles0 (-1) | Vehicles1 (-1) | Vehicles2 (-1) | Vehicles3 (-1) | Vehicles4 (-1) | Vehicles5 (-1) | Vehicles6 (0) | Vehicles7 (0) | (0))

braktar commented 7 years ago

The test case is the following :

I've got a matrix 4*4, with only 0 or 3. 1 vehicle, starting from index 0 and ending at this same point. with a capacity of 10 6 services (3 pickup, 3 deliveries) with quantities of 5 or 6.

problem = { matrices: [{ id: 'matrix_0', distance: [ [0, 3, 3, 3], [3, 0, 3, 3], [3, 3, 0, 3], [3, 3, 3, 0] ] }], units: [{ id: 'unit_0', }], points: [{ id: 'point_0', matrix_index: 0 }, { id: 'point_1', matrix_index: 1 }, { id: 'point_2', matrix_index: 2 }, { id: 'point_3', matrix_index: 3 }], vehicles: [{ id: 'vehicle_0', start_point_id: 'point_0', end_point_id: 'point_0', matrix_id: 'matrix_0', capacities: [{ unit_id: 'unit_0', limit: 10, overload_multiplier: 0, }] }], services: [{ id: 'service_0', type: 'pickup', activity: { point_id: 'point_1' }, quantities: [{ unit_id: 'unit_0', value: 5, }] }, { id: 'service_1', type: 'pickup', activity: { point_id: 'point_2' }, quantities: [{ unit_id: 'unit_0', value: 6, }] }, { id: 'service_2', type: 'delivery', activity: { point_id: 'point_3' }, quantities: [{ unit_id: 'unit_0', value: 6, }] }, { id: 'service_3', type: 'delivery', activity: { point_id: 'point_3' }, quantities: [{ unit_id: 'unit_0', value: 5, }] }, { id: 'service_4', type: 'delivery', activity: { point_id: 'point_3' }, quantities: [{ unit_id: 'unit_0', value: 5, }] }, { id: 'service_5', type: 'pickup', activity: { point_id: 'point_2' }, quantities: [{ unit_id: 'unit_0', value: 6, }] }], configuration: { resolution: { duration: 100 } } }

And is available here : https://github.com/Mapotempo/optimizer-api/blob/deliveries/test/wrappers/ortools_test.rb#L1229

braktar commented 7 years ago

... Was sending a time cost and sending only a distance matrix...

But it still send a SegFault using Savings heuristic