36 double minSkipped = 0;
38 std::vector<StopEdgeInfo> bestStops = stops;
39 std::shared_ptr<StopPathNode> bestNode =
nullptr;
41 std::vector<int> skipped;
46 std::priority_queue<std::shared_ptr<StopPathNode>, std::vector<std::shared_ptr<StopPathNode> >,
spnCompare> queue;
48 auto prev = std::make_shared<StopPathNode>(*
this,
StopEdgeInfo(source, -1,
SIMSTEP, sourcePos));
51 prev->cost = bestCost;
56 for (
int i = 0; i < (int)stops.size(); i++) {
62 auto ptr = std::make_shared<StopPathNode>(*
this, stop);
63 ptr->skippedPrio = minSkipped;
64 ptr->reachedPrio = prev->reachedPrio;
65 ptr->reachedMandatory = prev->reachedMandatory;
69 ptr->reachedMandatory += 1;
76 ptr->edges.insert(ptr->edges.begin(), edges.begin() + prev->routeIndex, edges.begin() + stop.
routeIndex + 1);
84#ifdef DEBUG_OPTIMIZE_SKIPPED
86 <<
" source=" << source->
getID() <<
" sourcePos=" << sourcePos
87 <<
" nStops=" << stops.size() <<
" skipped=" <<
toString(skipped) <<
" qSize=" << queue.size()
88 <<
" minSkipped=" << minSkipped <<
" totalPrio=" << totalPrio <<
"\n";
90 std::cout <<
" edge=" << stop.edge->getID() <<
" name=" << stop.nameTag.first <<
" wasSkipped=" << stop.skipped <<
" prio=" << stop.priority <<
"\n";
92 std::cout <<
" bestNode edge=" << bestNode->edge->getID() <<
" rPrio=" << bestNode->reachedPrio <<
" cost=" << bestNode->cost <<
"\n";
95 std::map<const MSEdge*, std::shared_ptr<StopPathNode> > bestIntermediate;
96 while (!queue.empty()) {
97 auto ptr = queue.top();
99#ifdef DEBUG_OPTIMIZE_SKIPPED
100 std::cout <<
" qSize=" << queue.size() <<
" topNode edge=" << ptr->edge->getID()
101 <<
" name='" << ptr->nameTag.first <<
"' skippedPrio=" << ptr->skippedPrio
102 <<
" trackChanges=" << ptr->trackChanges
103 <<
" cost=" << ptr->cost
104 <<
" reachedPrio=" << ptr->reachedPrio
105 <<
" mandatory=" << ptr->reachedMandatory
106 <<
" stopIndex=" << ptr->stopIndex <<
"\n";
108 auto succ = ptr->getSuccessor(stops, minSkipped);
109#ifdef DEBUG_OPTIMIZE_SKIPPED
110 std::cout <<
" cost2=" << ptr->cost <<
" reachedPrio2=" << ptr->reachedPrio <<
" mandatory2=" << ptr->reachedMandatory <<
" succ=" << (succ ==
nullptr ?
"NULL" : succ->edge->getID()) <<
"\n";
112 if (*bestNode < *ptr) {
113 minSkipped =
MIN2(minSkipped, totalPrio - ptr->reachedPrio);
114#ifdef DEBUG_OPTIMIZE_SKIPPED
115 std::cout <<
" newBestNode edge=" << bestNode->edge->getID() <<
" minSkipped=" << minSkipped
116 <<
" orm=" << bestNode->reachedMandatory <<
" rm=" << ptr->reachedMandatory
117 <<
" orp=" << bestNode->reachedPrio <<
" rp=" << ptr->reachedPrio
118 <<
" otc=" << bestNode->trackChanges <<
" tc=" << ptr->trackChanges
119 <<
" oc=" << bestNode->cost <<
" c=" << ptr->cost
124 if (succ !=
nullptr) {
125 if (minSkipped == 0 && ptr->trackChanges > bestNode->trackChanges) {
126#ifdef DEBUG_OPTIMIZE_SKIPPED
127 std::cout <<
"pruned by minTC=" << bestNode->trackChanges <<
"\n";
131 auto it = bestIntermediate.find(ptr->edge);
132 if (it == bestIntermediate.end()) {
133 bestIntermediate[ptr->edge] = ptr;
134#ifdef DEBUG_OPTIMIZE_SKIPPED
135 std::cout <<
"firstBest " << ptr->edge->getID() <<
"\n";
138 auto best = it->second;
139 assert(best->checked);
140 assert(ptr->checked);
142#ifdef DEBUG_OPTIMIZE_SKIPPED
143 std::cout <<
"alreadyBest " << ptr->edge->getID() <<
" rp=" << ptr->reachedPrio <<
" tc=" << ptr->trackChanges <<
" c=" << ptr->cost <<
"\n";
145 }
else if (!(*best < *ptr)) {
146#ifdef DEBUG_OPTIMIZE_SKIPPED
147 std::cout <<
"skip " << ptr->edge->getID()
148 <<
" orp=" << best->reachedPrio <<
" rp=" << ptr->reachedPrio
149 <<
" otc=" << best->trackChanges <<
" tc=" << ptr->trackChanges
150 <<
" oc=" << best->cost <<
" c=" << ptr->cost
155 bestIntermediate[ptr->edge] = ptr;
156#ifdef DEBUG_OPTIMIZE_SKIPPED
157 std::cout <<
"newBest " << ptr->edge->getID()
158 <<
" orp=" << best->reachedPrio <<
" rp=" << ptr->reachedPrio
159 <<
" otc=" << best->trackChanges <<
" tc=" << ptr->trackChanges
160 <<
" oc=" << best->cost <<
" c=" << ptr->cost
169 for (
auto& stop : stops) {
172 stop.backtracked =
true;
177 while (bestNode !=
nullptr && bestNode->stopIndex >= 0) {
178#ifdef DEBUG_OPTIMIZE_SKIPPED
179 std::cout <<
" revBestNode index=" << bestNode->stopIndex <<
" edge=" << bestNode->edge->getID() <<
" name=" << bestNode->nameTag.first <<
" tc=" << bestNode->trackChanges <<
" c=" << bestNode->cost <<
"\n";
181 stops[bestNode->stopIndex].skipped =
false;
182 stops[bestNode->stopIndex].backtracked =
false;
183 stops[bestNode->stopIndex].origEdge = bestNode->origEdge;
184 if (!bestEdges.empty() && !bestNode->edges.empty()) {
185 bestNode->edges.pop_back();
187 bestEdges.insert(bestEdges.begin(), bestNode->edges.begin(), bestNode->edges.end());
188 bestNode = bestNode->prev;
190#ifdef DEBUG_OPTIMIZE_SKIPPED
191 std::cout <<
"oldEdges=" <<
toString(edges) <<
"\nnewEdges=" <<
toString(bestEdges) <<
"\n";
204#ifdef DEBUG_OPTIMIZE_SKIPPED
205 std::cout <<
" prevIndex=" <<
prev->stopIndex <<
" prevEdge=" <<
prev->edge->getID() <<
" i=" <<
stopIndex <<
" edge=" <<
edge->
getID() <<
" unreachable\n";
211#ifdef DEBUG_OPTIMIZE_SKIPPED
212 std::cout <<
" prevIndex=" <<
prev->stopIndex <<
" prevEdge=" <<
prev->edge->getID() <<
" i=" <<
stopIndex <<
" edge=" <<
edge->
getID() <<
" reached with edges=" <<
toString(
edges) <<
" cost=" <<
cost <<
" newCost=" << newCost <<
"\n";
222 while (nextIndex < (
int)stops.size()) {
224#ifdef DEBUG_OPTIMIZE_SKIPPED
230 auto succ = std::make_shared<StopPathNode>(
so, next);
236 succ->prev = shared_from_this();
237 succ->stopIndex = nextIndex;
243#ifdef DEBUG_OPTIMIZE_SKIPPED
244 std::cout <<
" i=" <<
stopIndex <<
" next=" << nextIndex <<
" isMandatory\n";
248 while (
altIndex < (
int)alternatives.size()) {
255 auto succ = std::make_shared<StopPathNode>(
so, next);
262 succ->prev = shared_from_this();
263 succ->stopIndex = nextIndex;
264 succ->origEdge = succ->edge;
265 succ->edge = altEdge;
266 succ->trackChanges += 1;
272#ifdef DEBUG_OPTIMIZE_SKIPPED
273 std::cout <<
" i=" <<
stopIndex <<
" next=" << nextIndex <<
" skippedPrio=" <<
skippedPrio <<
" minSkipped=" << minSkipped <<
" pruned\n";
281#ifdef DEBUG_OPTIMIZE_SKIPPED
282 std::cout <<
" i=" <<
stopIndex <<
" noSuccessors\n";
virtual bool compute(const E *from, const E *to, const V *const vehicle, SUMOTime msTime, std::vector< const E * > &into, bool silent=false)=0
Builds the route between the given edges using the minimum effort at the given time The definition of...