53 const bool tryRepair,
const bool mayBeDisconnected) :
55 myPrecomputed(nullptr), myLastUsed(lastUsed), myTryRepair(tryRepair), myMayBeDisconnected(mayBeDisconnected) {
104 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 '" +
116 const bool skipTripRouting = (oc.
exists(
"write-trips") && oc.
getBool(
"write-trips")
169 const int initialSize = (int)oldEdges.size();
170 if (initialSize == 1) {
173 router.
compute(oldEdges.front(),
nullptr, &veh, begin, newEdges);
178 if (oldEdges.front()->prohibits(&veh)) {
180 const std::string& frontID = oldEdges.front()->getID();
181 for (ConstROEdgeVector::iterator i = oldEdges.begin(); i != oldEdges.end();) {
182 if ((*i)->prohibits(&veh) || (*i)->isInternal()) {
183 i = oldEdges.erase(i);
186 +
"' to '" + (*i)->getID() +
"' for vehicle '" + veh.
getID() +
"'.");
191 if (oldEdges.size() == 0) {
192 mh->
inform(
"Could not find new starting edge for vehicle '" + veh.
getID() +
"'.");
195 if (oldEdges.back()->prohibits(&veh)) {
197 const std::string& backID = oldEdges.back()->getID();
199 while (oldEdges.back()->prohibits(&veh) || oldEdges.back()->isInternal()) {
203 +
"' to edge '" + oldEdges.back()->getID() +
"' for vehicle '" + veh.
getID() +
"'.");
206 assert(mandatory.size() >= 2);
208 for (ConstROEdgeVector::iterator i = oldEdges.begin(); i != oldEdges.end();) {
209 if ((*i)->prohibits(&veh) || (*i)->isInternal()) {
211 i = oldEdges.erase(i);
217 if (mandatory.size() > oldEdges.size() && initialSize > 2) {
218 WRITE_MESSAGE(
"There are stop edges which were not part of the original route for vehicle '" + veh.
getID() +
"'.");
220 const ConstROEdgeVector& targets = mandatory.size() > oldEdges.size() ? mandatory : oldEdges;
221 newEdges.push_back(*(targets.begin()));
222 ConstROEdgeVector::iterator nextMandatory = mandatory.begin() + 1;
223 int lastMandatory = 0;
224 for (ConstROEdgeVector::const_iterator i = targets.begin() + 1;
225 i != targets.end() && nextMandatory != mandatory.end(); ++i) {
226 if ((*(i - 1))->isConnectedTo(*i, &veh)) {
227 newEdges.push_back(*i);
229 if (initialSize > 2) {
231 WRITE_MESSAGE(
"Edge '" + (*(i - 1))->
getID() +
"' not connected to edge '" + (*i)->getID() +
"' for vehicle '" + veh.
getID() +
"'.");
233 const ROEdge*
const last = newEdges.back();
235 if (!router.
compute(last, *i, &veh, begin, newEdges)) {
242 if (lastMandatory >= (
int)newEdges.size() || last == newEdges[lastMandatory] || !router.
compute(newEdges[lastMandatory], *nextMandatory, &veh, begin, edges)) {
243 mh->
inform(
"Mandatory edge '" + (*i)->getID() +
"' not reachable by vehicle '" + veh.
getID() +
"'.");
246 while (*i != *nextMandatory) {
249 newEdges.erase(newEdges.begin() + lastMandatory + 1, newEdges.end());
250 std::copy(edges.begin() + 1, edges.end(), back_inserter(newEdges));
253 if (*i == *nextMandatory) {
255 lastMandatory = (int)newEdges.size() - 1;
309 if ((*i)->getProbability() == 0) {
327 newSum += (*i)->getProbability();
332 (*i)->setProbability((*i)->getProbability() / newSum);
340 chosen -= (*i)->getProbability();
358 bool asAlternatives,
bool withExitTimes)
const {
359 if (asAlternatives) {
362 myAlternatives[i]->writeXMLDefinition(dev, veh,
true, withExitTimes);
379 edges.push_back(route->
getLast());
403 sum += (*i)->getProbability();
RORouteDef * copy(const std::string &id, const SUMOTime stopOffset) const
Returns a deep copy of the route definition.
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.
OutputDevice & writeXMLDefinition(OutputDevice &dev, const ROVehicle *const veh, bool asAlternatives, bool withExitTimes) const
Saves the built route / route alternatives.
const ROEdge * getDestination() const
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.
void addAlternativeDef(const RORouteDef *alternative)
Adds an alternative loaded from the file.
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) ...
static double rand(std::mt19937 *rng=0)
Returns a random real number in [0, 1)
void addStopOffset(const SUMOTime offset)
Adapts the until time of all stops by the given offset.
const ROEdge * getFirst() const
Returns the first edge in the route.
RORouteDef * copyOrigDest(const std::string &id) const
Returns a origin-destination copy of the route definition.
std::vector< const ROEdge * > ConstROEdgeVector
bool getBool(const std::string &name) const
Returns the boolean-value of the named option (only for Option_Bool)
const std::string & getID() const
Returns the id.
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) ...
double getOverallProb() const
Returns the sum of the probablities of the contained routes.
#define WRITE_WARNING(msg)
static OptionsCont & getOptions()
Retrieves the options.
RORoute * buildCurrentRoute(SUMOAbstractRouter< ROEdge, ROVehicle > &router, SUMOTime begin, const ROVehicle &veh) const
Triggers building of the complete route (via preComputeCurrentRoute) or returns precomputed route...
RORoute * myPrecomputed
precomputed route for out-of-order computation
const bool myMayBeDisconnected
A vehicle as used by router.
std::set< RORoute * > myRouteRefs
Routes which are deleted someplace else.
double getProbability() const
Returns the probability the driver will take this route with.
double recomputeCosts(const std::vector< const E *> &edges, const V *const v, SUMOTime msTime, double *lengthp=nullptr) const
ConstROEdgeVector getMandatoryEdges(const ROEdge *requiredStart, const ROEdge *requiredEnd) const
compute mandatory edges
const std::vector< SUMOVehicleParameter::Stop > & getStops() const
Returns the list of stops this route contains.
bool exists(const std::string &name) const
Returns the information whether the named option is known.
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...
const ROEdge * getLast() const
Returns the last edge in the route.
RORouteDef(const std::string &id, const int lastUsed, const bool tryRepair, const bool mayBeDisconnected)
Constructor.
Abstract base class providing static factory method.
const std::string & getID() const
Returns the id of the routable.
SUMOTime getDepartureTime() const
Returns the time the vehicle starts at, 0 for triggered vehicles.
const RGBColor * getColor() const
Returns this route's color.
A basic edge for routing applications.
Base class for objects which have an id.
virtual ~RORouteDef()
Destructor.
std::string myID
The name of the object.
void setCosts(double costs)
Sets the costs of the route.
const ConstROEdgeVector & getEdgeVector() const
Returns the list of edges this route consists of.
virtual 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.
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(const std::string &comment="")
Closes the most recently opened tag and optionally adds a comment.
static RouteCostCalculator< R, E, V > & getCalculator()
#define WRITE_MESSAGE(msg)
std::vector< RORoute * > myAlternatives
The alternatives.
OutputDevice & openTag(const std::string &xmlElement)
Opens an XML tag.
A complete router's route.