Fixes bug with non-negative weights
This commit is contained in:
		
							parent
							
								
									4e75bd1de6
								
							
						
					
					
						commit
						7e52e2c691
					
				| @ -95,7 +95,7 @@ public: | ||||
| 
 | ||||
|         InitializeThreadLocalStorageIfNecessary(); | ||||
|         NodeID middle = ( NodeID ) UINT_MAX; | ||||
| 
 | ||||
|         bool stOnSameEdge = false; | ||||
|         //Handling the special case that origin and destination are on same edge and that the order is correct.
 | ||||
|         if(phantomNodes.PhantomsAreOnSameNodeBasedEdge()){ | ||||
|             INFO("TODO: Start and target are on same edge, bidirected: " << (phantomNodes.startPhantom.isBidirected() && phantomNodes.targetPhantom.isBidirected() ? "yes": "no")); | ||||
| @ -109,6 +109,8 @@ public: | ||||
|                 int weight = std::abs(phantomNodes.startPhantom.weight1 - phantomNodes.targetPhantom.weight1); | ||||
|                 INFO("Weight is : " << weight); | ||||
|                 return weight; | ||||
|             } else { | ||||
|                 stOnSameEdge = true; | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
| @ -130,10 +132,10 @@ public: | ||||
| 
 | ||||
|         while(_forwardHeap->Size() + _backwardHeap->Size() > 0){ | ||||
|             if(_forwardHeap->Size() > 0){ | ||||
|                 _RoutingStep(_forwardHeap, _backwardHeap, true, &middle, &_upperbound); | ||||
|                 _RoutingStep(_forwardHeap, _backwardHeap, true, &middle, &_upperbound, stOnSameEdge); | ||||
|             } | ||||
|             if(_backwardHeap->Size() > 0){ | ||||
|                 _RoutingStep(_backwardHeap, _forwardHeap, false, &middle, &_upperbound); | ||||
|                 _RoutingStep(_backwardHeap, _forwardHeap, false, &middle, &_upperbound, stOnSameEdge); | ||||
|             } | ||||
|         } | ||||
|         //        INFO("bidirectional search iteration ended: " << _forwardHeap->Size() << "," << _backwardHeap->Size() << ", dist: " << _upperbound);
 | ||||
| @ -234,10 +236,10 @@ public: | ||||
|         return GetEscapedNameForNameID(nameID); | ||||
|     } | ||||
| private: | ||||
|     inline void _RoutingStep(HeapPtr & _forwardHeap, HeapPtr & _backwardHeap, const bool & forwardDirection, NodeID *middle, int *_upperbound) { | ||||
|     inline void _RoutingStep(HeapPtr & _forwardHeap, HeapPtr & _backwardHeap, const bool & forwardDirection, NodeID *middle, int *_upperbound, const bool stOnSameEdge) { | ||||
|         const NodeID node = _forwardHeap->DeleteMin(); | ||||
|         const int distance = _forwardHeap->GetKey(node); | ||||
|         if(_backwardHeap->WasInserted(node) && (distance > 0) ){ | ||||
|         if(_backwardHeap->WasInserted(node) && (!stOnSameEdge || distance > 0) ){ | ||||
|             const int newDistance = _backwardHeap->GetKey(node) + distance; | ||||
|             if(newDistance < *_upperbound){ | ||||
|                 *middle = node; | ||||
|  | ||||
							
								
								
									
										39
									
								
								DataStructures/SegmentInformation.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										39
									
								
								DataStructures/SegmentInformation.h
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,39 @@ | ||||
| /*
 | ||||
|     open source routing machine | ||||
|     Copyright (C) Dennis Luxen, others 2010 | ||||
| 
 | ||||
| This program is free software; you can redistribute it and/or modify | ||||
| it under the terms of the GNU AFFERO General Public License as published by | ||||
| the Free Software Foundation; either version 3 of the License, or | ||||
| any later version. | ||||
| 
 | ||||
| This program is distributed in the hope that it will be useful, | ||||
| but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
| GNU General Public License for more details. | ||||
| 
 | ||||
| You should have received a copy of the GNU Affero General Public License | ||||
| along with this program; if not, write to the Free Software | ||||
| Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA | ||||
| or see http://www.gnu.org/licenses/agpl.txt.
 | ||||
|  */ | ||||
| 
 | ||||
| #ifndef SEGMENTINFORMATION_H_ | ||||
| #define SEGMENTINFORMATION_H_ | ||||
| 
 | ||||
| #include <climits> | ||||
| 
 | ||||
| struct SegmentInformation { | ||||
|     _Coordinate location; | ||||
|     NodeID nameID; | ||||
|     unsigned length; | ||||
|     unsigned duration; | ||||
|     short turnInstruction; | ||||
|     bool necessary; | ||||
|     SegmentInformation(const _Coordinate & loc, const NodeID nam, const unsigned len, const unsigned dur, const short tInstr, const bool nec) : | ||||
|             location(loc), nameID(nam), length(len), duration(dur), turnInstruction(tInstr), necessary(nec) {} | ||||
|     SegmentInformation(const _Coordinate & loc, const NodeID nam, const unsigned len, const unsigned dur, const short tInstr) : | ||||
|         location(loc), nameID(nam), length(len), duration(dur), turnInstruction(tInstr), necessary(tInstr != 0) {} | ||||
| }; | ||||
| 
 | ||||
| #endif /* SEGMENTINFORMATION_H_ */ | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user