catch infinite loops

This commit is contained in:
Moritz Kobitzsch 2016-09-05 10:06:50 +02:00
parent 47a6cd5462
commit 5d79e0ac2f
3 changed files with 42 additions and 1 deletions

View File

@ -0,0 +1,35 @@
@routing @guidance
Feature: Features related to bugs
Background:
Given the profile "car"
Given a grid size of 5 meters
@2852
Scenario: Loop
Given the node map
| a | 1 | | g | | | b |
| | | | | | | |
| | | | | | | |
| e | | | | | | f |
| | | | | | | |
| | | | | | | 2 |
| d | | | h | | | c |
And the ways
| nodes | name | oneway |
| agb | top | yes |
| bfc | right | yes |
| chd | bottom | yes |
| dea | left | yes |
And the nodes
| node | highway |
| g | traffic_signals |
| f | traffic_signals |
| h | traffic_signals |
| e | traffic_signals |
When I route I should get
| waypoints | route | turns |
| 1,2 | top,right,right | depart,new name right,arrive |

View File

@ -1158,7 +1158,6 @@ std::vector<RouteStep> buildIntersections(std::vector<RouteStep> steps)
std::size_t last_valid_instruction = 0; std::size_t last_valid_instruction = 0;
for (std::size_t step_index = 0; step_index < steps.size(); ++step_index) for (std::size_t step_index = 0; step_index < steps.size(); ++step_index)
{ {
const auto next_step_index = step_index + 1;
auto &step = steps[step_index]; auto &step = steps[step_index];
const auto instruction = step.maneuver.instruction; const auto instruction = step.maneuver.instruction;
if (instruction.type == TurnType::Suppressed) if (instruction.type == TurnType::Suppressed)

View File

@ -574,6 +574,9 @@ IntersectionGenerator::GetActualNextIntersection(const NodeID starting_node,
NodeID node_at_intersection = starting_node; NodeID node_at_intersection = starting_node;
EdgeID incoming_edge = via_edge; EdgeID incoming_edge = via_edge;
// to prevent endless loops
const auto termination_node = node_based_graph.GetTarget(via_edge);
while (result.size() == 2 && while (result.size() == 2 &&
node_based_graph.GetEdgeData(via_edge).IsCompatibleTo( node_based_graph.GetEdgeData(via_edge).IsCompatibleTo(
node_based_graph.GetEdgeData(result[1].turn.eid))) node_based_graph.GetEdgeData(result[1].turn.eid)))
@ -581,6 +584,10 @@ IntersectionGenerator::GetActualNextIntersection(const NodeID starting_node,
node_at_intersection = node_based_graph.GetTarget(incoming_edge); node_at_intersection = node_based_graph.GetTarget(incoming_edge);
incoming_edge = result[1].turn.eid; incoming_edge = result[1].turn.eid;
result = GetConnectedRoads(node_at_intersection, incoming_edge); result = GetConnectedRoads(node_at_intersection, incoming_edge);
// When looping back to the original node, we obviously are in a loop. Stop there.
if (termination_node == node_based_graph.GetTarget(incoming_edge))
break;
} }
// return output if requested // return output if requested