51 #ifdef CHECK_MEMORY_LEAKS 53 #endif // CHECK_MEMORY_LEAKS 64 const bool tryRepair,
const bool mayBeDisconnected) :
66 myPrecomputed(0), myLastUsed(lastUsed), myTryRepair(tryRepair), myMayBeDisconnected(mayBeDisconnected)
115 mh->
inform(
"Vehicle '" + veh.
getID() +
"' is not allowed to depart on edge '" +
123 mh->
inform(
"Vehicle '" + veh.
getID() +
"' is not allowed to arrive on edge '" +
165 if (oldEdges.size() == 1) {
168 router.
compute(oldEdges.front(), 0, &veh, begin, newEdges);
174 if (oldEdges.front()->prohibits(&veh)) {
176 for (ConstROEdgeVector::iterator i = oldEdges.begin(); i != oldEdges.end();) {
177 if ((*i)->prohibits(&veh)) {
178 i = oldEdges.erase(i);
182 +
"' to '" + (*i)->getID() +
"' for vehicle '" + veh.
getID() +
"'.");
187 if (oldEdges.size() == 0) {
188 mh->
inform(
"Could not find new starting edge for vehicle '" + veh.
getID() +
"'.");
191 mandatory.push_back(oldEdges.front());
193 for (ConstROEdgeVector::const_iterator i = stops.begin(); i != stops.end(); ++i) {
194 if (*i != mandatory.back()) {
195 mandatory.push_back(*i);
198 if (oldEdges.back()->prohibits(&veh)) {
200 for (ConstROEdgeVector::reverse_iterator i = oldEdges.rbegin(); i != oldEdges.rend();) {
201 if ((*i)->prohibits(&veh)) {
203 oldEdges.erase(i.base());
207 +
"' to edge '" + (*i)->getID() +
"' for vehicle '" + veh.
getID() +
"'.");
212 if (mandatory.size() < 2 || oldEdges.back() != mandatory.back()) {
213 mandatory.push_back(oldEdges.back());
215 assert(mandatory.size() >= 2);
217 for (ConstROEdgeVector::iterator i = oldEdges.begin(); i != oldEdges.end();) {
218 if ((*i)->prohibits(&veh)) {
219 if (std::find(mandatory.begin(), mandatory.end(), *i) != mandatory.end()) {
220 mh->
inform(
"Mandatory edge '" + (*i)->getID() +
"' does not allow vehicle '" + veh.
getID() +
"'.");
223 i = oldEdges.erase(i);
229 newEdges.push_back(*(oldEdges.begin()));
230 ConstROEdgeVector::iterator nextMandatory = mandatory.begin() + 1;
231 size_t lastMandatory = 0;
232 for (ConstROEdgeVector::iterator i = oldEdges.begin() + 1;
233 i != oldEdges.end() && nextMandatory != mandatory.end(); ++i) {
234 if ((*(i - 1))->isConnectedTo(*i, &veh)) {
235 newEdges.push_back(*i);
239 WRITE_MESSAGE(
"Edge '" + (*(i - 1))->
getID() +
"' not connected to edge '" + (*i)->getID() +
"' for vehicle '" + veh.
getID() +
"'.");
242 router.
compute(newEdges.back(), *i, &veh, begin, edges);
243 if (edges.size() == 0) {
249 if (newEdges.back() != newEdges[lastMandatory]) {
250 router.
compute(newEdges[lastMandatory], *nextMandatory, &veh, begin, edges);
252 if (edges.size() == 0) {
253 mh->
inform(
"Mandatory edge '" + (*i)->getID() +
"' not reachable by vehicle '" + veh.getID() +
"'.");
256 while (*i != *nextMandatory) {
259 newEdges.erase(newEdges.begin() + lastMandatory + 1, newEdges.end());
262 std::copy(edges.begin() + 1, edges.end(), back_inserter(newEdges));
264 if (*i == *nextMandatory) {
266 lastMandatory = newEdges.size() - 1;
329 if ((*i)->getProbability() == 0) {
347 newSum += (*i)->getProbability();
352 (*i)->setProbability((*i)->getProbability() / newSum);
360 chosen -= (*i)->getProbability();
378 bool asAlternatives,
bool withExitTimes)
const {
379 if (asAlternatives) {
382 myAlternatives[i]->writeXMLDefinition(dev, veh,
true, withExitTimes);
399 edges.push_back(route->
getLast());
421 sum += (*i)->getProbability();
SUMOTime getDepartureTime() const
Returns the time the vehicle starts at, 0 for triggered vehicles.
static MsgHandler * getWarningInstance()
Returns the instance to add warnings to.
const std::string & getID() const
Returns the id of the vehicle.
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.
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 SUMOReal rand()
Returns a random real number in [0, 1)
const ConstROEdgeVector & getEdgeVector() const
Returns the list of edges this route consists of.
void setProbability(SUMOReal prob)
Sets the probability of the route.
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 repairCurrentRoute(SUMOAbstractRouter< ROEdge, ROVehicle > &router, SUMOTime begin, const ROVehicle &veh) const
Builds the complete route (or chooses her from the list of alternatives, when existing) ...
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.
SUMOReal getProbability() const
Returns the probability the driver will take this route with.
void setCosts(SUMOReal costs)
Sets the costs of the route.
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.
unsigned int myLastUsed
Index of the route used within the last step.
std::string myID
The name of the object.
const ConstROEdgeVector & getStopEdges() const
RORouteDef * copy(const std::string &id) const
Returns a deep copy of the route definition.
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.
virtual SUMOReal recomputeCosts(const std::vector< const E * > &edges, const V *const v, SUMOTime msTime) const =0
bool closeTag()
Closes the most recently opened tag.
virtual void 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...
static RouteCostCalculator< R, E, V > & getCalculator()
#define WRITE_MESSAGE(msg)
RORouteDef(const std::string &id, const unsigned int lastUsed, const bool tryRepair, const bool mayBeDisconnected)
Constructor.
std::vector< RORoute * > myAlternatives
The alternatives.
SUMOReal getOverallProb() const
Returns the sum of the probablities of the contained routes.
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.