61 #define DEBUGCOND (veh.getID() == "disabled") 74 double prob,
const std::string& file,
bool off) :
78 myProbability(prob), myUserProbability(prob), myAmInUserMode(false) {
80 for (MSEdgeVector::const_iterator j = edges.begin(); j != edges.end(); ++j) {
86 const std::vector<MSLane*>& destLanes = (*j)->getLanes();
87 for (std::vector<MSLane*>::const_iterator i = destLanes.begin(); i != destLanes.end(); ++i) {
88 (*i)->addMoveReminder(
this);
115 throw ProcessError(
"MSTriggeredRerouter " +
getID() +
": No destination edge id given.");
119 if (dest ==
"keepDestination") {
121 }
else if (dest ==
"terminateRoute") {
124 throw ProcessError(
"MSTriggeredRerouter " +
getID() +
": Destination edge '" + dest +
"' is not known.");
134 throw ProcessError(
"MSTriggeredRerouter " +
getID() +
": Attribute 'probability' for destination '" + dest +
"' is negative (must not).");
146 throw ProcessError(
"MSTriggeredRerouter " +
getID() +
": Edge '" + closed_id +
"' to close is not known.");
160 throw ProcessError(
"MSTriggeredRerouter " +
getID() +
": Lane '" + closed_id +
"' to close is not known.");
179 if (routeStr ==
"") {
184 throw ProcessError(
"MSTriggeredRerouter " +
getID() +
": Route '" + routeStr +
"' does not exist.");
194 throw ProcessError(
"MSTriggeredRerouter " +
getID() +
": Attribute 'probability' for route '" + routeStr +
"' is negative (must not).");
204 if (parkingarea ==
"") {
205 throw ProcessError(
"MSTriggeredRerouter " +
getID() +
": No parking area id given.");
209 throw ProcessError(
"MSTriggeredRerouter " +
getID() +
": Parking area '" + parkingarea +
"' is not known.");
218 throw ProcessError(
"MSTriggeredRerouter " +
getID() +
": Attribute 'probability' for destination '" + parkingarea +
"' is negative (must not).");
242 std::set<MSEdge*> affected;
244 affected.insert(&((*l)->getEdge()));
269 if (i->begin == currentTime && !(i->closed.empty() && i->closedLanes.empty()) && i->permissions !=
SVCAll) {
270 for (MSEdgeVector::iterator e = i->closed.begin(); e != i->closed.end(); ++e) {
271 for (std::vector<MSLane*>::const_iterator l = (*e)->getLanes().begin(); l != (*e)->getLanes().end(); ++l) {
273 (*l)->setPermissions(i->permissions, i->id);
275 (*e)->rebuildAllowedLanes();
277 for (std::vector<MSLane*>::iterator l = i->closedLanes.begin(); l != i->closedLanes.end(); ++l) {
278 (*l)->setPermissions(i->permissions, i->id);
279 (*l)->getEdge().rebuildAllowedLanes();
284 if (i->end == currentTime && !(i->closed.empty() && i->closedLanes.empty()) && i->permissions !=
SVCAll) {
285 for (MSEdgeVector::iterator e = i->closed.begin(); e != i->closed.end(); ++e) {
286 for (std::vector<MSLane*>::const_iterator l = (*e)->getLanes().begin(); l != (*e)->getLanes().end(); ++l) {
287 (*l)->resetPermissions(i->id);
290 (*e)->rebuildAllowedLanes();
292 for (std::vector<MSLane*>::iterator l = i->closedLanes.begin(); l != i->closedLanes.end(); ++l) {
293 (*l)->resetPermissions(i->id);
294 (*l)->getEdge().rebuildAllowedLanes();
305 if (i->begin <= time && i->end > time) {
308 i->edgeProbs.getOverallProb() > 0 ||
310 i->routeProbs.getOverallProb() > 0 ||
312 i->parkProbs.getOverallProb() > 0 ||
328 if (i->begin <= time && i->end > time) {
329 if (i->parkProbs.getOverallProb() != 0 || i->edgeProbs.getOverallProb() != 0 || i->routeProbs.getOverallProb() != 0 || !i->closed.empty()) {
357 if (rerouteDef == 0) {
366 if (rerouteDef->
closedLanes.size() > 0 && !hasReroutingDevice) {
372 #ifdef DEBUG_REROUTER 380 if (newParkingArea != 0) {
397 if (edgesFromPark.size() > 0) {
398 edges.insert(edges.end(), edgesFromPark.begin() + 1, edgesFromPark.end());
401 veh.replaceRouteEdges(edges,
false,
false,
false);
402 std::string errorMsg;
403 if (!veh.replaceParkingArea(newParkingArea, errorMsg)) {
405 +
"' could not reroute to new parkingArea '" + newParkingArea->
getID()
416 #ifdef DEBUG_REROUTER 418 std::cout <<
" replacedRoute from routeDist " << newRoute->
getID() <<
"\n";
424 const MSEdge* newEdge = lastEdge;
426 double newArrivalPos = -1;
427 const bool destUnreachable = std::find(rerouteDef->
closed.begin(), rerouteDef->
closed.end(), lastEdge) != rerouteDef->
closed.end();
430 if (rerouteDef->
closed.size() == 0 || destUnreachable) {
440 WRITE_WARNING(
"Cannot keep destination edge '" + lastEdge->
getID() +
"' for vehicle '" + veh.
getID() +
"' due to closed edges. Terminating route.");
445 }
else if (newEdge == 0) {
446 #ifdef DEBUG_REROUTER 448 std::cout <<
" could not find new edge!\n";
463 const bool useNewRoute = veh.replaceRouteEdges(edges);
464 #ifdef DEBUG_REROUTER 465 if (
DEBUGCOND) std::cout <<
" rerouting: newEdge=" << newEdge->
getID() <<
" useNewRoute=" << useNewRoute <<
" newArrivalPos=" << newArrivalPos <<
" numClosed=" << rerouteDef->
closed.size()
466 <<
" destUnreachable=" << destUnreachable <<
" containsClosed=" << veh.getRoute().containsAnyOf(rerouteDef->
closed) <<
"\n";
468 if (useNewRoute && newArrivalPos != -1) {
470 veh.setArrivalPos(newArrivalPos);
527 return defaultWeight;
542 if (destParkArea != 0 &&
545 typedef std::map<std::string, double> ParkingParamMap_t;
546 typedef std::map<MSParkingArea*, ParkingParamMap_t> MSParkingAreaMap_t;
548 ParkingParamMap_t weights;
551 weights[
"probability"] =
getWeight(veh,
"parking.probability.weight", 0.0);
554 weights[
"capacity"] =
getWeight(veh,
"parking.capacity.weight", 0.0);
557 weights[
"absfreespace"] =
getWeight(veh,
"parking.absfreespace.weight", 0.0);
560 weights[
"relfreespace"] =
getWeight(veh,
"parking.relfreespace.weight", 0.0);
563 weights[
"distanceto"] =
getWeight(veh,
"parking.distanceto.weight",
getWeight(veh,
"parking.distance.weight", 1.0));
566 weights[
"timeto"] =
getWeight(veh,
"parking.timeto.weight", 0.0);
569 weights[
"distancefrom"] =
getWeight(veh,
"parking.distancefrom.weight", 0.0);
572 weights[
"timefrom"] =
getWeight(veh,
"parking.timefrom.weight", 0.0);
575 ParkingParamMap_t maxValues;
577 maxValues[
"probability"] = 0.0;
578 maxValues[
"capacity"] = 0.0;
579 maxValues[
"absfreespace"] = 0.0;
580 maxValues[
"relfreespace"] = 0.0;
581 maxValues[
"distanceto"] = 0.0;
582 maxValues[
"timeto"] = 0.0;
583 maxValues[
"distancefrom"] = 0.0;
584 maxValues[
"timefrom"] = 0.0;
587 MSParkingAreaMap_t parkAreas;
594 for (
int i = 0; i < (int)parks.size(); ++i) {
596 const double prob = probs[i];
600 ParkingParamMap_t parkValues;
611 if (edgesToPark.size() > 0) {
616 if (edgesFromPark.size() > 0) {
618 parkValues[
"probability"] = prob;
620 if (parkValues[
"probability"] > maxValues[
"probability"]) {
621 maxValues[
"probability"] = parkValues[
"probability"];
624 parkValues[
"capacity"] = (double)(pa->
getCapacity());
626 parkValues[
"relfreespace"] = parkValues[
"absfreespace"] / parkValues[
"capacity"];
628 if (parkValues[
"capacity"] > maxValues[
"capacity"]) {
629 maxValues[
"capacity"] = parkValues[
"capacity"];
632 if (parkValues[
"absfreespace"] > maxValues[
"absfreespace"]) {
633 maxValues[
"absfreespace"] = parkValues[
"absfreespace"];
636 if (parkValues[
"relfreespace"] > maxValues[
"relfreespace"]) {
637 maxValues[
"relfreespace"] = parkValues[
"relfreespace"];
644 routeToPark.begin(), routeToPark.end(), includeInternalLengths);
649 if (parkValues[
"distanceto"] > maxValues[
"distanceto"]) {
650 maxValues[
"distanceto"] = parkValues[
"distanceto"];
653 if (parkValues[
"timeto"] > maxValues[
"timeto"]) {
654 maxValues[
"timeto"] = parkValues[
"timeto"];
661 routeFromPark.begin(), routeFromPark.end(), includeInternalLengths);
666 if (parkValues[
"distancefrom"] > maxValues[
"distancefrom"]) {
667 maxValues[
"distancefrom"] = parkValues[
"distancefrom"];
670 if (parkValues[
"timefrom"] > maxValues[
"timefrom"]) {
671 maxValues[
"timefrom"] = parkValues[
"timefrom"];
674 parkAreas[pa] = parkValues;
681 double minParkingCost = 0.0;
683 for (MSParkingAreaMap_t::iterator it = parkAreas.begin(); it != parkAreas.end(); ++it) {
685 ParkingParamMap_t parkValues = it->second;
688 parkValues[
"probability"] = maxValues[
"probability"] > 0.0 ? 1.0 - parkValues[
"probability"] / maxValues[
"probability"] : 0.0;
689 parkValues[
"capacity"] = maxValues[
"capacity"] > 0.0 ? 1.0 - parkValues[
"capacity"] / maxValues[
"capacity"] : 0.0;
690 parkValues[
"absfreespace"] = maxValues[
"absfreespace"] > 0.0 ? 1.0 - parkValues[
"absfreespace"] / maxValues[
"absfreespace"] : 0.0;
691 parkValues[
"relfreespace"] = maxValues[
"relfreespace"] > 0.0 ? 1.0 - parkValues[
"relfreespace"] / maxValues[
"relfreespace"] : 0.0;
693 parkValues[
"distanceto"] = maxValues[
"distanceto"] > 0.0 ? parkValues[
"distanceto"] / maxValues[
"distanceto"] : 0.0;
694 parkValues[
"timeto"] = maxValues[
"timeto"] > 0.0 ? parkValues[
"timeto"] / maxValues[
"timeto"] : 0.0;
696 parkValues[
"distancefrom"] = maxValues[
"distancefrom"] > 0.0 ? parkValues[
"distancefrom"] / maxValues[
"distancefrom"] : 0.0;
697 parkValues[
"timefrom"] = maxValues[
"timefrom"] > 0.0 ? parkValues[
"timefrom"] / maxValues[
"timefrom"] : 0.0;
700 double parkingCost = 0.0;
703 for (ParkingParamMap_t::iterator pc = parkValues.begin(); pc != parkValues.end(); ++pc) {
704 parkingCost += weights[pc->first] * pc->second;
708 if (nearParkArea == 0 || parkingCost < minParkingCost) {
709 minParkingCost = parkingCost;
710 nearParkArea = it->first;
A lane area vehicles can halt at.
double getProbability() const
Returns the rerouting probability.
MSEdgeVector closed
The list of closed edges.
virtual bool replaceRoute(const MSRoute *route, bool onInit=false, int offset=0, bool addStops=true)=0
Replaces the current route by the given one.
const RerouteInterval * getCurrentReroute(SUMOTime time, SUMOVehicle &veh) const
Returns the rerouting definition valid for the given time and vehicle, 0 if none. ...
MSEdge & getEdge() const
Returns the lane's edge.
MSParkingArea * rerouteParkingZone(const MSTriggeredRerouter::RerouteInterval *rerouteDef, SUMOVehicle &veh) const
virtual double getArrivalPos() const =0
Returns this vehicle's desired arrivalPos for its current route (may change on reroute) ...
double getBeginLanePosition() const
Returns the begin position of this stop.
double getUserProbability() const
Returns the rerouting probability given by the user.
virtual MSParkingArea * getNextParkingArea()=0
MESegment * getSegmentForEdge(const MSEdge &e, double pos=0)
Get the segment for a given edge at a given position.
SUMOTime myCurrentIntervalEnd
virtual const MSRoute & getRoute() const =0
Returns the current route.
SUMOTime setPermissions(const SUMOTime currentTime)
Sets the edge permission if there are any defined in the closingEdge.
SVCPermissions myCurrentPermissions
List of permissions for closed edges.
RandomDistributor< MSEdge * > edgeProbs
The distributions of new destinations to use.
The vehicle arrived at a junction.
virtual double recomputeCosts(const std::vector< const E *> &edges, const V *const v, SUMOTime msTime) const =0
lane of a reroute of type closing
SUMOTime myCurrentIntervalBegin
The first and the last time steps of the interval.
std::vector< MSLane * > myCurrentClosedLanes
List of closed lanes.
virtual const MSEdge * getEdge() const =0
Returns the edge the vehicle is currently at.
Notification
Definition of a vehicle state.
double getDistanceBetween(double fromPos, double toPos, const MSEdge *fromEdge, const MSEdge *toEdge, bool includeInternal=true) const
Compute the distance between 2 given edges on this route, including the length of internal lanes...
std::string time2string(SUMOTime t)
A device that performs vehicle rerouting based on current edge speeds.
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...
virtual MSLane * getLane() const =0
Returns the lane the vehicle is on.
const RGBColor & getColor() const
Returns the color.
weights: time range begin
static MSNet * getInstance()
Returns the pointer to the unique instance of MSNet (singleton).
static bool dictionary(const std::string &id, MSEdge *edge)
Inserts edge into the static dictionary Returns true if the key id isn't already in the dictionary...
const std::vector< T > & getVals() const
Returns the members of the distribution.
const MSEdge * getLastEdge() const
returns the destination edge
void setUserUsageProbability(double prob)
Sets the probability with which a vehicle is rerouted given by the user.
std::vector< const MSEdge * > ConstMSEdgeVector
const std::string & getID() const
Returns the id.
const SVCPermissions SVCAll
all VClasses are allowed
void setUserMode(bool val)
Sets whether the process is currently steered by the user.
SAX-handler base for SUMO-files.
MSTriggeredRerouter(const std::string &id, const MSEdgeVector &edges, double prob, const std::string &file, bool off)
Constructor.
virtual bool hasAttribute(int id) const =0
Returns the information whether the named (by its enum-value) attribute is within the current list...
double myProbability
The probability and the user-given probability.
The purpose of the edge is not known.
#define WRITE_WARNING(msg)
A road/street connecting two junctions.
virtual void myEndElement(int element)
Called when a closing tag occurs.
The vehicle changes lanes (micro only)
bool knowsParameter(const std::string &key) const
Returns whether the parameter is known.
An abstract device that changes the state of the micro simulation.
const std::vector< double > & getProbs() const
Returns the probabilities assigned to the members of the distribution.
double getWeight(SUMOVehicle &veh, const std::string param, const double defaultWeight) const
Representation of a vehicle.
Encapsulated SAX-Attributes.
static const RGBColor DEFAULT_COLOR
The default color (for vehicle types and vehicles)
virtual ~MSTriggeredRerouter()
Destructor.
SUMOTime begin
The begin time these definitions are valid.
MSEventControl * getBeginOfTimestepEvents()
Returns the event control for events executed at the begin of a time step.
A wrapper for a Command function.
int getCapacity() const
Returns the area capacity.
RandomDistributor< MSParkingArea * > myCurrentParkProb
new destinations with probabilities
virtual void addEvent(Command *operation, SUMOTime execTimeStep=-1)
Adds an Event.
SUMOTime getCurrentTimeStep() const
Returns the current simulation step.
RandomDistributor< const MSRoute * > myCurrentRouteProb
new routes with probabilities
static double rand()
Returns a random real number in [0, 1)
static MSEdge mySpecialDest_keepDestination
special destination values
void addDetector(MSMoveReminder *data)
Adds a data collector for a detector to this segment.
bool hasInternalLinks() const
return whether the network contains internal links
probability of route of a reroute
static bool gUsingInternalLanes
Information whether the simulation regards internal lanes.
SVCPermissions parseVehicleClasses(const std::string &allowedS)
Parses the given definition of allowed vehicle classes into the given containers Deprecated classes g...
probability of destiny of a reroute
Something on a lane to be noticed about vehicle movement.
static MSEdge mySpecialDest_terminateRoute
const SUMOVTypeParameter & getParameter() const
int getOccupancy() const
Returns the area occupancy.
bool notifyEnter(SUMOVehicle &veh, MSMoveReminder::Notification reason, const MSLane *enteredLane=0)
Tries to reroute the vehicle.
bool notifyLeave(SUMOVehicle &veh, double lastPos, MSMoveReminder::Notification reason, const MSLane *enteredLane=0)
Removes the reminder.
T get(MTRand *which=0) const
Draw a sample of the distribution.
RandomDistributor< MSEdge * > myCurrentEdgeProb
new destinations with probabilities
void clear()
Clears the distribution.
entry for an alternative parking zone
const std::string & getParameter(const std::string &key, const std::string &defaultValue) const
Returns the value for a given key.
static bool dictionary(const std::string &id, MSLane *lane)
Static (sic!) container methods {.
T getOpt(int attr, const char *objectid, bool &ok, T defaultValue, bool report=true) const
Tries to read given attribute assuming it is an int.
RandomDistributor< MSParkingArea * > parkProbs
The distributions of new parking areas to use as destinations.
SUMOTime end
The end time these definitions are valid.
bool containsAnyOf(const MSEdgeVector &edgelist) const
std::vector< MSLane * > closedLanes
The list of closed lanes.
RandomDistributor< const MSRoute * > routeProbs
The distributions of new routes to use.
virtual double getPositionOnLane() const =0
Get the vehicle's position along the lane.
virtual const SUMOVehicleParameter & getParameter() const =0
Returns the vehicle's parameter (including departure definition)
SUMOTime getOptSUMOTimeReporting(int attr, const char *objectid, bool &ok, SUMOTime defaultValue, bool report=true) const
Tries to read given attribute assuming it is a SUMOTime.
A single mesoscopic segment (cell)
virtual std::string getStringSecure(int id, const std::string &def) const =0
Returns the string-value of the named (by its enum-value) attribute.
std::vector< RerouteInterval > myIntervals
List of rerouting definition intervals.
static double _2double(const E *const data)
converts a char-type array into the double value described by it
bool inUserMode() const
Returns whether the user is setting the rerouting probability.
MSEdgeVector myCurrentClosed
List of closed edges.
bool myAmInUserMode
Information whether the current rerouting probability is the user-given.
static MELoop * gMesoNet
mesoscopic simulation infrastructure
double getOverallProb() const
Return the sum of the probabilites assigned to the members.
an aggreagated-output interval
virtual void myStartElement(int element, const SUMOSAXAttributes &attrs)
Called on the opening of a tag;.
virtual MSDevice * getDevice(const std::type_info &type) const =0
Returns a device of the given type if it exists or 0.
SUMOAbstractRouter< MSEdge, SUMOVehicle > & getRouterTT(const MSEdgeVector &prohibited=MSEdgeVector()) const
std::vector< MSEdge * > MSEdgeVector
bool notifyMove(SUMOVehicle &veh, double oldPos, double newPos, double newSpeed)
Triggers rerouting (once) for vehicles that are already on the edge when the rerouter activates...
const MSLane & getLane() const
Returns the lane this stop is located at.
static SUMOAbstractRouter< MSEdge, SUMOVehicle > & getRouterTT(const MSEdgeVector &prohibited=MSEdgeVector())
return the router instance
bool add(T val, double prob, bool checkDuplicates=true)
Adds a value with an assigned probability to the distribution.
SVCPermissions permissions
The permissions to use.
Representation of a lane in the micro simulation.
const std::vector< SUMOVehicleParameter::Stop > & getStops() const
Returns the stops.
virtual const std::string & getID() const =0
Get the vehicle's ID.
MSEdgeVector closedLanesAffected
The list of edges that are affect by closed lanes.
virtual const MSVehicleType & getVehicleType() const =0
Returns the vehicle's type.
static bool dictionary(const std::string &id, const MSRoute *route)
Adds a route to the dictionary.
MSParkingArea * getParkingArea(const std::string &id) const
Returns the named parking area.