51 #ifdef CHECK_MEMORY_LEAKS
53 #endif // CHECK_MEMORY_LEAKS
60 const bool tryRepair) :
62 myPrecomputed(0), myLastUsed(lastUsed), myTryRepair(tryRepair)
105 mh->
inform(
"Vehicle '" + veh.
getID() +
"' is not allowed to depart on edge '" +
111 mh->
inform(
"Vehicle '" + veh.
getID() +
"' is not allowed to arrive on edge '" +
123 std::vector<const ROEdge*> edges;
149 std::vector<const ROEdge*> oldEdges =
myAlternatives[0]->getEdgeVector();
150 std::vector<const ROEdge*> newEdges;
151 std::vector<const ROEdge*> mandatory;
152 if (oldEdges.size() == 1) {
154 router.
compute(oldEdges.front(), oldEdges.front(), &veh, begin, newEdges);
157 mandatory.push_back(oldEdges.front());
166 if (mandatory.size() < 2 || oldEdges.back() != mandatory.back()) {
167 mandatory.push_back(oldEdges.back());
169 assert(mandatory.size() >= 2);
171 for (std::vector<const ROEdge*>::iterator i = oldEdges.begin(); i != oldEdges.end();) {
172 if ((*i)->prohibits(&veh)) {
173 if (std::find(mandatory.begin(), mandatory.end(), *i) != mandatory.end()) {
174 mh->
inform(
"Stop edge '" + (*i)->getID() +
"' does not allow vehicle '" + veh.
getID() +
"'.");
177 i = oldEdges.erase(i);
183 newEdges.push_back(*(oldEdges.begin()));
184 std::vector<const ROEdge*>::iterator nextMandatory = mandatory.begin() + 1;
185 std::vector<const ROEdge*>::iterator lastMandatory = newEdges.begin();
186 for (std::vector<const ROEdge*>::iterator i = oldEdges.begin() + 1; i != oldEdges.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) {
194 if (*i == *nextMandatory) {
196 if (newEdges.back() != *lastMandatory) {
197 router.
compute(*lastMandatory, *nextMandatory, &veh, begin, edges);
199 if (edges.size() == 0) {
200 mh->
inform(
"Mandatory edge '" + (*i)->getID() +
"' not reachable by vehicle '" + veh.getID() +
"'.");
203 newEdges.erase(lastMandatory + 1, newEdges.end());
204 std::copy(edges.begin() + 1, edges.end(), back_inserter(newEdges));
208 std::copy(edges.begin() + 1, edges.end(), back_inserter(newEdges));
210 if (*i == *nextMandatory) {
275 if ((*i)->getProbability() == 0) {
293 newSum += (*i)->getProbability();
298 (*i)->setProbability((*i)->getProbability() / newSum);
306 chosen -= (*i)->getProbability();
324 bool asAlternatives,
bool withExitTimes)
const {
325 if (asAlternatives) {
328 myAlternatives[i]->writeXMLDefinition(dev, veh,
true, withExitTimes);
343 std::vector<const ROEdge*> edges;
345 edges.push_back(route->
getLast());
367 sum += (*i)->getProbability();