60 const bool tryRepair,
const bool mayBeDisconnected) :
62 myPrecomputed(0), myLastUsed(lastUsed), myTryRepair(tryRepair), myMayBeDisconnected(mayBeDisconnected) {
111 mh->
inform(
"Vehicle '" + veh.
getID() +
"' is not allowed to depart on edge '" +
119 mh->
inform(
"Vehicle '" + veh.
getID() +
"' is not allowed to arrive on edge '" +
175 const int initialSize = (int)oldEdges.size();
176 if (initialSize == 1) {
179 router.
compute(oldEdges.front(), 0, &veh, begin, newEdges);
185 if (oldEdges.front()->prohibits(&veh)) {
187 const std::string& frontID = oldEdges.front()->getID();
188 for (ConstROEdgeVector::iterator i = oldEdges.begin(); i != oldEdges.end();) {
189 if ((*i)->prohibits(&veh)) {
190 i = oldEdges.erase(i);
193 +
"' to '" + (*i)->getID() +
"' for vehicle '" + veh.
getID() +
"'.");
198 if (oldEdges.size() == 0) {
199 mh->
inform(
"Could not find new starting edge for vehicle '" + veh.
getID() +
"'.");
202 mandatory.push_back(oldEdges.front());
204 for (ConstROEdgeVector::const_iterator i = stops.begin(); i != stops.end(); ++i) {
205 if ((*i)->isInternal()) {
209 if (after != mandatory.back()) {
210 mandatory.push_back(before);
211 mandatory.push_back(after);
214 if (*i != mandatory.back()) {
215 mandatory.push_back(*i);
219 if (oldEdges.back()->prohibits(&veh)) {
221 const std::string& backID = oldEdges.back()->
getID();
223 while (oldEdges.back()->prohibits(&veh)) {
227 +
"' to edge '" + oldEdges.back()->getID() +
"' for vehicle '" + veh.
getID() +
"'.");
229 if (mandatory.size() < 2 || oldEdges.back() != mandatory.back()) {
230 mandatory.push_back(oldEdges.back());
232 assert(mandatory.size() >= 2);
234 for (ConstROEdgeVector::iterator i = oldEdges.begin(); i != oldEdges.end();) {
235 if ((*i)->prohibits(&veh)) {
237 i = oldEdges.erase(i);
243 if (mandatory.size() > oldEdges.size() && initialSize > 2) {
244 WRITE_MESSAGE(
"There are stop edges which were not part of the original route for vehicle '" + veh.
getID() +
"'.");
246 const ConstROEdgeVector& targets = mandatory.size() > oldEdges.size() ? mandatory : oldEdges;
247 newEdges.push_back(*(targets.begin()));
248 ConstROEdgeVector::iterator nextMandatory = mandatory.begin() + 1;
249 int lastMandatory = 0;
250 for (ConstROEdgeVector::const_iterator i = targets.begin() + 1;
251 i != targets.end() && nextMandatory != mandatory.end(); ++i) {
252 if ((*(i - 1))->isConnectedTo(*i, &veh)) {
253 newEdges.push_back(*i);
255 if (initialSize > 2) {
257 WRITE_MESSAGE(
"Edge '" + (*(i - 1))->
getID() +
"' not connected to edge '" + (*i)->getID() +
"' for vehicle '" + veh.
getID() +
"'.");
259 const ROEdge*
const last = newEdges.back();
261 if (!router.
compute(last, *i, &veh, begin, newEdges)) {
268 if (lastMandatory >= (
int)newEdges.size() || last == newEdges[lastMandatory] || !router.
compute(newEdges[lastMandatory], *nextMandatory, &veh, begin, edges)) {
269 mh->
inform(
"Mandatory edge '" + (*i)->getID() +
"' not reachable by vehicle '" + veh.
getID() +
"'.");
272 while (*i != *nextMandatory) {
275 newEdges.erase(newEdges.begin() + lastMandatory + 1, newEdges.end());
276 std::copy(edges.begin() + 1, edges.end(), back_inserter(newEdges));
279 if (*i == *nextMandatory) {
281 lastMandatory = (int)newEdges.size() - 1;
335 if ((*i)->getProbability() == 0) {
353 newSum += (*i)->getProbability();
358 (*i)->setProbability((*i)->getProbability() / newSum);
366 chosen -= (*i)->getProbability();
384 bool asAlternatives,
bool withExitTimes)
const {
385 if (asAlternatives) {
388 myAlternatives[i]->writeXMLDefinition(dev, veh,
true, withExitTimes);
405 edges.push_back(route->
getLast());
429 sum += (*i)->getProbability();
SUMOTime getDepartureTime() const
Returns the time the vehicle starts at, 0 for triggered vehicles.
int myLastUsed
Index of the route used within the last step.
static MsgHandler * getWarningInstance()
Returns the instance to add warnings to.
void setProbability(double prob)
Sets the probability of the route.
OutputDevice & writeAttr(const SumoXMLAttr attr, const T &val)
writes a named attribute
bool myNewRoute
Information whether a new route was generated.
static MsgHandler * getErrorInstance()
Returns the instance to add errors to.
RORouteDef * copyOrigDest(const std::string &id) const
Returns a origin-destination copy of the route definition.
bool repairCurrentRoute(SUMOAbstractRouter< ROEdge, ROVehicle > &router, SUMOTime begin, const ROVehicle &veh, ConstROEdgeVector oldEdges, ConstROEdgeVector &newEdges) const
Builds the complete route (or chooses her from the list of alternatives, when existing) ...
double getOverallProb() const
Returns the sum of the probablities of the contained routes.
Some static methods for string processing.
void addAlternative(SUMOAbstractRouter< ROEdge, ROVehicle > &router, const ROVehicle *const, RORoute *current, SUMOTime begin)
Adds an alternative to the list of routes.
RORoute * buildCurrentRoute(SUMOAbstractRouter< ROEdge, ROVehicle > &router, SUMOTime begin, const ROVehicle &veh) const
Triggers building of the complete route (via preComputeCurrentRoute) or returns precomputed route...
void addAlternativeDef(const RORouteDef *alternative)
Adds an alternative loaded from the file.
bool getBool(const std::string &name) const
Returns the boolean-value of the named option (only for Option_Bool)
static double rand(std::mt19937 *rng=0)
Returns a random real number in [0, 1)
const ConstROEdgeVector & getEdgeVector() const
Returns the list of edges this route consists of.
virtual bool compute(const E *from, const E *to, const V *const vehicle, SUMOTime msTime, std::vector< const E * > &into)=0
Builds the route between the given edges using the minimum effort at the given time The definition of...
void preComputeCurrentRoute(SUMOAbstractRouter< ROEdge, ROVehicle > &router, SUMOTime begin, const ROVehicle &veh) const
Builds the complete route (or chooses her from the list of alternatives, when existing) ...
void addStopOffset(const SUMOTime offset)
Adapts the until time of all stops by the given offset.
std::vector< const ROEdge * > ConstROEdgeVector
#define WRITE_WARNING(msg)
static OptionsCont & getOptions()
Retrieves the options.
RORoute * myPrecomputed
precomputed route for out-of-order computation
const std::string & getID() const
Returns the id.
const bool myMayBeDisconnected
A vehicle as used by router.
const ROEdge * getLast() const
Returns the last edge in the route.
std::set< RORoute * > myRouteRefs
Routes which are deleted someplace else.
OutputDevice & writeXMLDefinition(OutputDevice &dev, const ROVehicle *const veh, bool asAlternatives, bool withExitTimes) const
Saves the built route / route alternatives.
const RGBColor * getColor() const
Returns this route's color.
RORouteDef(const std::string &id, const int lastUsed, const bool tryRepair, const bool mayBeDisconnected)
Constructor.
Abstract base class providing static factory method.
const ROEdge * getDestination() const
const ROEdge * getFirst() const
Returns the first edge in the route.
A basic edge for routing applications.
Base class for objects which have an id.
virtual ~RORouteDef()
Destructor.
virtual double recomputeCosts(const std::vector< const E * > &edges, const V *const v, SUMOTime msTime) const =0
std::string myID
The name of the object.
const ConstROEdgeVector & getStopEdges() const
RORouteDef * copy(const std::string &id, const SUMOTime stopOffset) const
Returns a deep copy of the route definition.
const std::string & getID() const
Returns the id of the vehicle.
void setCosts(double costs)
Sets the costs of the route.
void inform(std::string msg, bool addType=true)
adds a new error to the list
A storage for options typed value containers)
Base class for a vehicle's route definition.
const ROEdge * getNormalAfter() const
if this edge is an internal edge, return its first normal successor, otherwise the edge itself ...
void addLoadedAlternative(RORoute *alternative)
Adds a single alternative loaded from the file An alternative may also be generated during DUA...
Static storage of an output device and its base (abstract) implementation.
bool closeTag()
Closes the most recently opened tag.
const ROEdge * getNormalBefore() const
if this edge is an internal edge, return its first normal predecessor, otherwise the edge itself ...
static RouteCostCalculator< R, E, V > & getCalculator()
double getProbability() const
Returns the probability the driver will take this route with.
#define WRITE_MESSAGE(msg)
std::vector< RORoute * > myAlternatives
The alternatives.
const std::vector< SUMOVehicleParameter::Stop > & getStops() const
Returns the list of stops this route contains.
OutputDevice & openTag(const std::string &xmlElement)
Opens an XML tag.
A complete router's route.