Fix weights and annotations for phantom points on one segment
This commit is contained in:
parent
fe5d1a6e74
commit
6586737835
@ -209,13 +209,22 @@ inline std::vector<RouteStep> assembleSteps(const datafacade::BaseDataFacade &fa
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
BOOST_ASSERT(source_node.fwd_segment_position == target_node.fwd_segment_position);
|
BOOST_ASSERT(source_node.fwd_segment_position == target_node.fwd_segment_position);
|
||||||
// s t
|
BOOST_ASSERT(source_traversed_in_reverse == target_traversed_in_reverse);
|
||||||
// u-------------v
|
|
||||||
// |---| source_duration
|
|
||||||
// |---------| target_duration
|
|
||||||
|
|
||||||
const EdgeWeight duration = target_duration - source_duration;
|
// The difference (target-source) should handle
|
||||||
|
// all variants for similar directions u-v and s-t (and opposite)
|
||||||
|
// s(t) t(s) source_traversed_in_reverse = target_traversed_in_reverse = false
|
||||||
|
// u-------------v
|
||||||
|
// |---| source_weight
|
||||||
|
// |---------| target_weight
|
||||||
|
|
||||||
|
// s(t) t(s) source_traversed_in_reverse = target_traversed_in_reverse = true
|
||||||
|
// u-------------v
|
||||||
|
// | |---------| source_weight
|
||||||
|
// | |---| target_weight
|
||||||
const EdgeWeight weight = target_weight - source_weight;
|
const EdgeWeight weight = target_weight - source_weight;
|
||||||
|
const EdgeWeight duration = target_duration - source_duration;
|
||||||
|
BOOST_ASSERT(weight >= 0);
|
||||||
BOOST_ASSERT(duration >= 0);
|
BOOST_ASSERT(duration >= 0);
|
||||||
|
|
||||||
steps.push_back(RouteStep{source_node.name_id,
|
steps.push_back(RouteStep{source_node.name_id,
|
||||||
|
@ -35,12 +35,16 @@ void routingStep(const datafacade::ContiguousInternalMemoryDataFacade<algorithm:
|
|||||||
const auto weight = forward_heap.GetKey(node);
|
const auto weight = forward_heap.GetKey(node);
|
||||||
|
|
||||||
auto update_upper_bounds = [&](NodeID to, EdgeWeight forward_weight, EdgeWeight edge_weight) {
|
auto update_upper_bounds = [&](NodeID to, EdgeWeight forward_weight, EdgeWeight edge_weight) {
|
||||||
if (reverse_heap.WasInserted(to) && reverse_heap.WasRemoved(to))
|
// Upper bound for the path source -> target with
|
||||||
|
// weight(source -> node) = forward_weight, weight(node -> to) = edge_weight and
|
||||||
|
// weight(to -> target) ≤ reverse_weight is forward_weight + edge_weight + reverse_weight
|
||||||
|
// More tighter upper bound requires additional condition reverse_heap.WasRemoved(to)
|
||||||
|
// with weight(to -> target) = reverse_weight and all weights ≥ 0
|
||||||
|
if (reverse_heap.WasInserted(to))
|
||||||
{
|
{
|
||||||
auto reverse_weight = reverse_heap.GetKey(to);
|
auto reverse_weight = reverse_heap.GetKey(to);
|
||||||
auto path_weight = forward_weight + edge_weight + reverse_weight;
|
auto path_weight = forward_weight + edge_weight + reverse_weight;
|
||||||
BOOST_ASSERT(path_weight >= 0);
|
if (path_weight >= 0 && path_weight < path_upper_bound)
|
||||||
if (path_weight < path_upper_bound)
|
|
||||||
{
|
{
|
||||||
middle_node = to;
|
middle_node = to;
|
||||||
path_upper_bound = path_weight;
|
path_upper_bound = path_weight;
|
||||||
|
Loading…
Reference in New Issue
Block a user