52 #ifdef CHECK_MEMORY_LEAKS
54 #endif // CHECK_MEMORY_LEAKS
61 const bool tryRepair) :
63 myPrecomputed(0), myLastUsed(lastUsed), myTryRepair(tryRepair)
106 mh->
inform(
"Vehicle '" + veh.
getID() +
"' is not allowed to depart on edge '" +
112 mh->
inform(
"Vehicle '" + veh.
getID() +
"' is not allowed to arrive on edge '" +
124 std::vector<const ROEdge*> edges;
150 std::vector<const ROEdge*> oldEdges =
myAlternatives[0]->getEdgeVector();
151 std::vector<const ROEdge*> newEdges;
152 std::vector<const ROEdge*> mandatory;
153 if (oldEdges.size() == 1) {
155 router.
compute(oldEdges.front(), oldEdges.front(), &veh, begin, newEdges);
158 mandatory.push_back(oldEdges.front());
160 for (std::vector<const ROEdge*>::const_iterator i = stops.begin(); i != stops.end(); ++i) {
161 if (*i != mandatory.back()) {
162 mandatory.push_back(*i);
165 if (mandatory.size() < 2 || oldEdges.back() != mandatory.back()) {
166 mandatory.push_back(oldEdges.back());
168 assert(mandatory.size() >= 2);
170 for (std::vector<const ROEdge*>::iterator i = oldEdges.begin(); i != oldEdges.end();) {
171 if ((*i)->prohibits(&veh)) {
172 if (std::find(mandatory.begin(), mandatory.end(), *i) != mandatory.end()) {
173 mh->
inform(
"Mandatory edge '" + (*i)->getID() +
"' does not allow vehicle '" + veh.
getID() +
"'.");
176 i = oldEdges.erase(i);
182 newEdges.push_back(*(oldEdges.begin()));
183 std::vector<const ROEdge*>::iterator nextMandatory = mandatory.begin() + 1;
184 size_t lastMandatory = 0;
185 for (std::vector<const ROEdge*>::iterator i = oldEdges.begin() + 1;
186 i != oldEdges.end() && nextMandatory != mandatory.end(); ++i) {
187 if ((*(i - 1))->isConnectedTo(*i)) {
189 newEdges.push_back(*i);
191 std::vector<const ROEdge*> edges;
192 router.
compute(newEdges.back(), *i, &veh, begin, edges);
193 if (edges.size() == 0) {
199 router.
compute(newEdges[lastMandatory], *nextMandatory, &veh, begin, edges);
200 if (edges.size() == 0) {
201 mh->
inform(
"Mandatory edge '" + (*i)->getID() +
"' not reachable by vehicle '" + veh.getID() +
"'.");
204 while (*i != *nextMandatory) {
207 newEdges.erase(newEdges.begin() + lastMandatory + 1, newEdges.end());
210 std::copy(edges.begin() + 1, edges.end(), back_inserter(newEdges));
212 if (*i == *nextMandatory) {
214 lastMandatory = newEdges.size() - 1;
276 if ((*i)->getProbability() == 0) {
294 newSum += (*i)->getProbability();
299 (*i)->setProbability((*i)->getProbability() / newSum);
307 chosen -= (*i)->getProbability();
325 bool asAlternatives,
bool withExitTimes)
const {
326 if (asAlternatives) {
329 myAlternatives[i]->writeXMLDefinition(dev, veh,
true, withExitTimes);
344 std::vector<const ROEdge*> edges;
346 edges.push_back(route->
getLast());
368 sum += (*i)->getProbability();