Rewiring routing algorithms
This commit is contained in:
parent
a2153b668a
commit
b5600bdd7f
@ -29,6 +29,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#define ALTERNATIVEROUTES_H_
|
||||
|
||||
#include "BasicRoutingInterface.h"
|
||||
#include "../DataStructures/SearchEngineData.h"
|
||||
#include <boost/unordered_map.hpp>
|
||||
#include <cmath>
|
||||
#include <vector>
|
||||
@ -37,11 +38,11 @@ const double VIAPATH_ALPHA = 0.15;
|
||||
const double VIAPATH_EPSILON = 0.10; //alternative at most 15% longer
|
||||
const double VIAPATH_GAMMA = 0.75; //alternative shares at most 75% with the shortest.
|
||||
|
||||
template<class QueryDataT>
|
||||
class AlternativeRouting : private BasicRoutingInterface<QueryDataT> {
|
||||
typedef BasicRoutingInterface<QueryDataT> super;
|
||||
typedef typename QueryDataT::Graph SearchGraph;
|
||||
typedef typename QueryDataT::QueryHeap QueryHeap;
|
||||
template<class DataFacadeT>
|
||||
class AlternativeRouting : private BasicRoutingInterface<DataFacadeT> {
|
||||
typedef BasicRoutingInterface<DataFacadeT> super;
|
||||
typedef SearchEngineData::QueryGraph SearchGraph;
|
||||
typedef SearchEngineData::QueryHeap QueryHeap;
|
||||
typedef std::pair<NodeID, NodeID> SearchSpaceEdge;
|
||||
|
||||
struct RankedCandidateNode {
|
||||
@ -55,10 +56,10 @@ class AlternativeRouting : private BasicRoutingInterface<QueryDataT> {
|
||||
};
|
||||
|
||||
const SearchGraph * search_graph;
|
||||
|
||||
SearchEngineData & engine_working_data;
|
||||
public:
|
||||
|
||||
AlternativeRouting(QueryDataT & qd) : super(qd), search_graph(qd.graph) { }
|
||||
AlternativeRouting(DataFacadeT & qd, SearchEngineData & engine_working_data) : super(qd), search_graph(qd.graph), engine_working_data(engine_working_data) { }
|
||||
|
||||
~AlternativeRouting() {}
|
||||
|
||||
|
@ -29,6 +29,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#define BASICROUTINGINTERFACE_H_
|
||||
|
||||
#include "../DataStructures/RawRouteData.h"
|
||||
#include "../DataStructures/SearchEngineData.h"
|
||||
#include "../Util/ContainerUtils.h"
|
||||
#include "../Util/SimpleLogger.h"
|
||||
|
||||
@ -39,15 +40,22 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
#include <stack>
|
||||
|
||||
template<class QueryDataT>
|
||||
template<class SearchEngineDataT>
|
||||
class BasicRoutingInterface : boost::noncopyable{
|
||||
protected:
|
||||
QueryDataT & _queryData;
|
||||
SearchEngineDataT * engine_working_data;
|
||||
public:
|
||||
BasicRoutingInterface(QueryDataT & qd) : _queryData(qd) { }
|
||||
BasicRoutingInterface(SearchEngineDataT * engine_working_data) : engine_working_data(engine_working_data) { }
|
||||
virtual ~BasicRoutingInterface(){ };
|
||||
|
||||
inline void RoutingStep(typename QueryDataT::QueryHeap & _forwardHeap, typename QueryDataT::QueryHeap & _backwardHeap, NodeID *middle, int *_upperbound, const int edgeBasedOffset, const bool forwardDirection) const {
|
||||
inline void RoutingStep(
|
||||
SearchEngineData::QueryHeap & _forwardHeap,
|
||||
SearchEngineData::QueryHeap & _backwardHeap,
|
||||
NodeID *middle,
|
||||
int *_upperbound,
|
||||
const int edgeBasedOffset,
|
||||
const bool forwardDirection
|
||||
) const {
|
||||
const NodeID node = _forwardHeap.DeleteMin();
|
||||
const int distance = _forwardHeap.GetKey(node);
|
||||
//SimpleLogger().Write() << "Settled (" << _forwardHeap.GetData( node ).parent << "," << node << ")=" << distance;
|
||||
@ -68,11 +76,15 @@ public:
|
||||
}
|
||||
|
||||
//Stalling
|
||||
for ( typename QueryDataT::Graph::EdgeIterator edge = _queryData.graph->BeginEdges( node ); edge < _queryData.graph->EndEdges(node); ++edge ) {
|
||||
const typename QueryDataT::Graph::EdgeData & data = _queryData.graph->GetEdgeData(edge);
|
||||
for(
|
||||
EdgeID edge = engine_working_data->BeginEdges( node );
|
||||
edge < engine_working_data->EndEdges(node);
|
||||
++edge
|
||||
) {
|
||||
const typename SearchEngineDataT::EdgeData & data = engine_working_data->GetEdgeData(edge);
|
||||
bool backwardDirectionFlag = (!forwardDirection) ? data.forward : data.backward;
|
||||
if(backwardDirectionFlag) {
|
||||
const NodeID to = _queryData.graph->GetTarget(edge);
|
||||
const NodeID to = engine_working_data->GetTarget(edge);
|
||||
const int edgeWeight = data.distance;
|
||||
|
||||
assert( edgeWeight > 0 );
|
||||
@ -85,12 +97,12 @@ public:
|
||||
}
|
||||
}
|
||||
|
||||
for ( typename QueryDataT::Graph::EdgeIterator edge = _queryData.graph->BeginEdges( node ); edge < _queryData.graph->EndEdges(node); ++edge ) {
|
||||
const typename QueryDataT::Graph::EdgeData & data = _queryData.graph->GetEdgeData(edge);
|
||||
for ( EdgeID edge = engine_working_data->BeginEdges( node ); edge < engine_working_data->EndEdges(node); ++edge ) {
|
||||
const typename SearchEngineDataT::EdgeData & data = engine_working_data->GetEdgeData(edge);
|
||||
bool forwardDirectionFlag = (forwardDirection ? data.forward : data.backward );
|
||||
if(forwardDirectionFlag) {
|
||||
|
||||
const NodeID to = _queryData.graph->GetTarget(edge);
|
||||
const NodeID to = engine_working_data->GetTarget(edge);
|
||||
const int edgeWeight = data.distance;
|
||||
|
||||
assert( edgeWeight > 0 );
|
||||
@ -124,20 +136,20 @@ public:
|
||||
edge = recursionStack.top();
|
||||
recursionStack.pop();
|
||||
|
||||
typename QueryDataT::Graph::EdgeIterator smallestEdge = SPECIAL_EDGEID;
|
||||
EdgeID smallestEdge = SPECIAL_EDGEID;
|
||||
int smallestWeight = INT_MAX;
|
||||
for(typename QueryDataT::Graph::EdgeIterator eit = _queryData.graph->BeginEdges(edge.first);eit < _queryData.graph->EndEdges(edge.first);++eit){
|
||||
const int weight = _queryData.graph->GetEdgeData(eit).distance;
|
||||
if(_queryData.graph->GetTarget(eit) == edge.second && weight < smallestWeight && _queryData.graph->GetEdgeData(eit).forward){
|
||||
for(EdgeID eit = engine_working_data->BeginEdges(edge.first);eit < engine_working_data->EndEdges(edge.first);++eit){
|
||||
const int weight = engine_working_data->GetEdgeData(eit).distance;
|
||||
if(engine_working_data->GetTarget(eit) == edge.second && weight < smallestWeight && engine_working_data->GetEdgeData(eit).forward){
|
||||
smallestEdge = eit;
|
||||
smallestWeight = weight;
|
||||
}
|
||||
}
|
||||
|
||||
if(smallestEdge == SPECIAL_EDGEID){
|
||||
for(typename QueryDataT::Graph::EdgeIterator eit = _queryData.graph->BeginEdges(edge.second);eit < _queryData.graph->EndEdges(edge.second);++eit){
|
||||
const int weight = _queryData.graph->GetEdgeData(eit).distance;
|
||||
if(_queryData.graph->GetTarget(eit) == edge.first && weight < smallestWeight && _queryData.graph->GetEdgeData(eit).backward){
|
||||
for(EdgeID eit = engine_working_data->BeginEdges(edge.second);eit < engine_working_data->EndEdges(edge.second);++eit){
|
||||
const int weight = engine_working_data->GetEdgeData(eit).distance;
|
||||
if(engine_working_data->GetTarget(eit) == edge.first && weight < smallestWeight && engine_working_data->GetEdgeData(eit).backward){
|
||||
smallestEdge = eit;
|
||||
smallestWeight = weight;
|
||||
}
|
||||
@ -145,7 +157,7 @@ public:
|
||||
}
|
||||
assert(smallestWeight != INT_MAX);
|
||||
|
||||
const typename QueryDataT::Graph::EdgeData& ed = _queryData.graph->GetEdgeData(smallestEdge);
|
||||
const typename SearchEngineDataT::EdgeData& ed = engine_working_data->GetEdgeData(smallestEdge);
|
||||
if(ed.shortcut) {//unpack
|
||||
const NodeID middle = ed.id;
|
||||
//again, we need to this in reversed order
|
||||
@ -156,8 +168,8 @@ public:
|
||||
unpackedPath.push_back(
|
||||
_PathData(
|
||||
ed.id,
|
||||
_queryData.nodeHelpDesk->GetNameIndexFromEdgeID(ed.id),
|
||||
_queryData.nodeHelpDesk->GetTurnInstructionForEdgeID(ed.id),
|
||||
engine_working_data->GetNameIndexFromEdgeID(ed.id),
|
||||
engine_working_data->GetTurnInstructionForEdgeID(ed.id),
|
||||
ed.distance
|
||||
)
|
||||
);
|
||||
@ -174,20 +186,20 @@ public:
|
||||
edge = recursionStack.top();
|
||||
recursionStack.pop();
|
||||
|
||||
typename QueryDataT::Graph::EdgeIterator smallestEdge = SPECIAL_EDGEID;
|
||||
EdgeID smallestEdge = SPECIAL_EDGEID;
|
||||
int smallestWeight = INT_MAX;
|
||||
for(typename QueryDataT::Graph::EdgeIterator eit = _queryData.graph->BeginEdges(edge.first);eit < _queryData.graph->EndEdges(edge.first);++eit){
|
||||
const int weight = _queryData.graph->GetEdgeData(eit).distance;
|
||||
if(_queryData.graph->GetTarget(eit) == edge.second && weight < smallestWeight && _queryData.graph->GetEdgeData(eit).forward){
|
||||
for(EdgeID eit = engine_working_data->BeginEdges(edge.first);eit < engine_working_data->EndEdges(edge.first);++eit){
|
||||
const int weight = engine_working_data->GetEdgeData(eit).distance;
|
||||
if(engine_working_data->GetTarget(eit) == edge.second && weight < smallestWeight && engine_working_data->GetEdgeData(eit).forward){
|
||||
smallestEdge = eit;
|
||||
smallestWeight = weight;
|
||||
}
|
||||
}
|
||||
|
||||
if(smallestEdge == SPECIAL_EDGEID){
|
||||
for(typename QueryDataT::Graph::EdgeIterator eit = _queryData.graph->BeginEdges(edge.second);eit < _queryData.graph->EndEdges(edge.second);++eit){
|
||||
const int weight = _queryData.graph->GetEdgeData(eit).distance;
|
||||
if(_queryData.graph->GetTarget(eit) == edge.first && weight < smallestWeight && _queryData.graph->GetEdgeData(eit).backward){
|
||||
for(EdgeID eit = engine_working_data->BeginEdges(edge.second);eit < engine_working_data->EndEdges(edge.second);++eit){
|
||||
const int weight = engine_working_data->GetEdgeData(eit).distance;
|
||||
if(engine_working_data->GetTarget(eit) == edge.first && weight < smallestWeight && engine_working_data->GetEdgeData(eit).backward){
|
||||
smallestEdge = eit;
|
||||
smallestWeight = weight;
|
||||
}
|
||||
@ -195,7 +207,7 @@ public:
|
||||
}
|
||||
assert(smallestWeight != INT_MAX);
|
||||
|
||||
const typename QueryDataT::Graph::EdgeData& ed = _queryData.graph->GetEdgeData(smallestEdge);
|
||||
const typename SearchEngineDataT::EdgeData& ed = engine_working_data->GetEdgeData(smallestEdge);
|
||||
if(ed.shortcut) {//unpack
|
||||
const NodeID middle = ed.id;
|
||||
//again, we need to this in reversed order
|
||||
@ -209,7 +221,12 @@ public:
|
||||
unpackedPath.push_back(t);
|
||||
}
|
||||
|
||||
inline void RetrievePackedPathFromHeap(typename QueryDataT::QueryHeap & _fHeap, typename QueryDataT::QueryHeap & _bHeap, const NodeID middle, std::vector<NodeID>& packedPath) const {
|
||||
inline void RetrievePackedPathFromHeap(
|
||||
SearchEngineData::QueryHeap & _fHeap,
|
||||
SearchEngineData::QueryHeap & _bHeap,
|
||||
const NodeID middle,
|
||||
std::vector<NodeID> & packedPath
|
||||
) const {
|
||||
NodeID pathNode = middle;
|
||||
while(pathNode != _fHeap.GetData(pathNode).parent) {
|
||||
pathNode = _fHeap.GetData(pathNode).parent;
|
||||
@ -225,7 +242,7 @@ public:
|
||||
}
|
||||
}
|
||||
|
||||
inline void RetrievePackedPathFromSingleHeap(typename QueryDataT::QueryHeap & search_heap, const NodeID middle, std::vector<NodeID>& packed_path) const {
|
||||
inline void RetrievePackedPathFromSingleHeap(SearchEngineData::QueryHeap & search_heap, const NodeID middle, std::vector<NodeID>& packed_path) const {
|
||||
NodeID pathNode = middle;
|
||||
while(pathNode != search_heap.GetData(pathNode).parent) {
|
||||
pathNode = search_heap.GetData(pathNode).parent;
|
||||
|
@ -30,12 +30,15 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
#include "BasicRoutingInterface.h"
|
||||
|
||||
#include "../DataStructures/SearchEngineData.h"
|
||||
|
||||
template<class QueryDataT>
|
||||
class ShortestPathRouting : public BasicRoutingInterface<QueryDataT>{
|
||||
typedef BasicRoutingInterface<QueryDataT> super;
|
||||
typedef typename QueryDataT::QueryHeap QueryHeap;
|
||||
SearchEngineData & engine_working_data;
|
||||
public:
|
||||
ShortestPathRouting( QueryDataT & qd) : super(qd) {}
|
||||
ShortestPathRouting( QueryDataT & qd, SearchEngineData & engine_working_data) : super(qd), engine_working_data(engine_working_data) {}
|
||||
|
||||
~ShortestPathRouting() {}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user