Fixes Alternative Routing when including loops
This commit is contained in:
		
							parent
							
								
									a48f02e0da
								
							
						
					
					
						commit
						603b83e1c3
					
				
							
								
								
									
										29
									
								
								features/testbot/alternative_loop.feature
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										29
									
								
								features/testbot/alternative_loop.feature
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,29 @@ | ||||
| @routing @testbot @alternative | ||||
| Feature: Alternative route | ||||
| 
 | ||||
|     Background: | ||||
|         Given the profile "testbot" | ||||
| 
 | ||||
|     Scenario: Alternative Loop Paths | ||||
|         Given the node map | ||||
|             | a | 2 | 1 | b | | ||||
|             | 7 |   |   | 4 | | ||||
|             | 8 |   |   | 3 | | ||||
|             | c | 5 | 6 | d | | ||||
| 
 | ||||
|         And the ways | ||||
|             | nodes | oneway | | ||||
|             | ab    | yes    | | ||||
|             | bd    | yes    | | ||||
|             | dc    | yes    | | ||||
|             | ca    | yes    | | ||||
| 
 | ||||
|         And the query options | ||||
|             | alt | true | | ||||
| 
 | ||||
|         When I route I should get | ||||
|             | from | to | route          | alternative | | ||||
|             | 1    | 2  | ab,bd,dc,ca,ab |             | | ||||
|             | 3    | 4  | bd,dc,ca,ab,bd |             | | ||||
|             | 5    | 6  | dc,ca,ab,bd,dc |             | | ||||
|             | 7    | 8  | ca,ab,bd,dc,ca |             | | ||||
| @ -156,8 +156,10 @@ class AlternativeRouting final | ||||
|         std::vector<NodeID> packed_forward_path; | ||||
|         std::vector<NodeID> packed_reverse_path; | ||||
| 
 | ||||
|         if (upper_bound_to_shortest_path_distance != | ||||
|             forward_heap1.GetKey(middle_node) + reverse_heap1.GetKey(middle_node)) | ||||
|         const bool path_is_a_loop = | ||||
|             upper_bound_to_shortest_path_distance != | ||||
|             forward_heap1.GetKey(middle_node) + reverse_heap1.GetKey(middle_node); | ||||
|         if (path_is_a_loop) | ||||
|         { | ||||
|             // Self Loop
 | ||||
|             BOOST_ASSERT(forward_heap1.GetData(middle_node).parent == middle_node && | ||||
| @ -239,6 +241,8 @@ class AlternativeRouting final | ||||
|         std::vector<NodeID> preselected_node_list; | ||||
|         for (const NodeID node : via_node_candidate_list) | ||||
|         { | ||||
|             if (node == middle_node) | ||||
|                 continue; | ||||
|             const auto fwd_iterator = approximated_forward_sharing.find(node); | ||||
|             const int fwd_sharing = | ||||
|                 (fwd_iterator != approximated_forward_sharing.end()) ? fwd_iterator->second : 0; | ||||
| @ -265,10 +269,13 @@ class AlternativeRouting final | ||||
|         } | ||||
| 
 | ||||
|         std::vector<NodeID> &packed_shortest_path = packed_forward_path; | ||||
|         std::reverse(packed_shortest_path.begin(), packed_shortest_path.end()); | ||||
|         packed_shortest_path.emplace_back(middle_node); | ||||
|         packed_shortest_path.insert(packed_shortest_path.end(), packed_reverse_path.begin(), | ||||
|                                     packed_reverse_path.end()); | ||||
|         if (!path_is_a_loop) | ||||
|         { | ||||
|             std::reverse(packed_shortest_path.begin(), packed_shortest_path.end()); | ||||
|             packed_shortest_path.emplace_back(middle_node); | ||||
|             packed_shortest_path.insert(packed_shortest_path.end(), packed_reverse_path.begin(), | ||||
|                                         packed_reverse_path.end()); | ||||
|         } | ||||
|         std::vector<RankedCandidateNode> ranked_candidates_list; | ||||
| 
 | ||||
|         // prioritizing via nodes for deep inspection
 | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user