Fixes bug with non-negative weights
This commit is contained in:
		
							parent
							
								
									4e75bd1de6
								
							
						
					
					
						commit
						7e52e2c691
					
				| @ -95,7 +95,7 @@ public: | |||||||
| 
 | 
 | ||||||
|         InitializeThreadLocalStorageIfNecessary(); |         InitializeThreadLocalStorageIfNecessary(); | ||||||
|         NodeID middle = ( NodeID ) UINT_MAX; |         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.
 |         //Handling the special case that origin and destination are on same edge and that the order is correct.
 | ||||||
|         if(phantomNodes.PhantomsAreOnSameNodeBasedEdge()){ |         if(phantomNodes.PhantomsAreOnSameNodeBasedEdge()){ | ||||||
|             INFO("TODO: Start and target are on same edge, bidirected: " << (phantomNodes.startPhantom.isBidirected() && phantomNodes.targetPhantom.isBidirected() ? "yes": "no")); |             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); |                 int weight = std::abs(phantomNodes.startPhantom.weight1 - phantomNodes.targetPhantom.weight1); | ||||||
|                 INFO("Weight is : " << weight); |                 INFO("Weight is : " << weight); | ||||||
|                 return weight; |                 return weight; | ||||||
|  |             } else { | ||||||
|  |                 stOnSameEdge = true; | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
| @ -130,10 +132,10 @@ public: | |||||||
| 
 | 
 | ||||||
|         while(_forwardHeap->Size() + _backwardHeap->Size() > 0){ |         while(_forwardHeap->Size() + _backwardHeap->Size() > 0){ | ||||||
|             if(_forwardHeap->Size() > 0){ |             if(_forwardHeap->Size() > 0){ | ||||||
|                 _RoutingStep(_forwardHeap, _backwardHeap, true, &middle, &_upperbound); |                 _RoutingStep(_forwardHeap, _backwardHeap, true, &middle, &_upperbound, stOnSameEdge); | ||||||
|             } |             } | ||||||
|             if(_backwardHeap->Size() > 0){ |             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);
 |         //        INFO("bidirectional search iteration ended: " << _forwardHeap->Size() << "," << _backwardHeap->Size() << ", dist: " << _upperbound);
 | ||||||
| @ -234,10 +236,10 @@ public: | |||||||
|         return GetEscapedNameForNameID(nameID); |         return GetEscapedNameForNameID(nameID); | ||||||
|     } |     } | ||||||
| private: | 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 NodeID node = _forwardHeap->DeleteMin(); | ||||||
|         const int distance = _forwardHeap->GetKey(node); |         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; |             const int newDistance = _backwardHeap->GetKey(node) + distance; | ||||||
|             if(newDistance < *_upperbound){ |             if(newDistance < *_upperbound){ | ||||||
|                 *middle = node; |                 *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