63 #define DEBUGCOND (veh.getID() == "disabled") 76 double prob,
const std::string& file,
bool off) :
80 myProbability(prob), myUserProbability(prob), myAmInUserMode(false) {
82 for (MSEdgeVector::const_iterator j = edges.begin(); j != edges.end(); ++j) {
88 const std::vector<MSLane*>& destLanes = (*j)->getLanes();
89 for (std::vector<MSLane*>::const_iterator i = destLanes.begin(); i != destLanes.end(); ++i) {
90 (*i)->addMoveReminder(
this);
117 throw ProcessError(
"MSTriggeredRerouter " +
getID() +
": No destination edge id given.");
121 if (dest ==
"keepDestination") {
123 }
else if (dest ==
"terminateRoute") {
126 throw ProcessError(
"MSTriggeredRerouter " +
getID() +
": Destination edge '" + dest +
"' is not known.");
136 throw ProcessError(
"MSTriggeredRerouter " +
getID() +
": Attribute 'probability' for destination '" + dest +
"' is negative (must not).");
148 throw ProcessError(
"MSTriggeredRerouter " +
getID() +
": Edge '" + closed_id +
"' to close is not known.");
162 throw ProcessError(
"MSTriggeredRerouter " +
getID() +
": Lane '" + closed_id +
"' to close is not known.");
181 if (routeStr ==
"") {
186 throw ProcessError(
"MSTriggeredRerouter " +
getID() +
": Route '" + routeStr +
"' does not exist.");
196 throw ProcessError(
"MSTriggeredRerouter " +
getID() +
": Attribute 'probability' for route '" + routeStr +
"' is negative (must not).");
206 if (parkingarea ==
"") {
207 throw ProcessError(
"MSTriggeredRerouter " +
getID() +
": No parking area id given.");
211 throw ProcessError(
"MSTriggeredRerouter " +
getID() +
": Parking area '" + parkingarea +
"' is not known.");
220 throw ProcessError(
"MSTriggeredRerouter " +
getID() +
": Attribute 'probability' for destination '" + parkingarea +
"' is negative (must not).");
244 std::set<MSEdge*> affected;
246 affected.insert(&((*l)->getEdge()));
271 if (i->begin == currentTime && !(i->closed.empty() && i->closedLanes.empty()) && i->permissions !=
SVCAll) {
272 for (MSEdgeVector::iterator e = i->closed.begin(); e != i->closed.end(); ++e) {
273 for (std::vector<MSLane*>::const_iterator l = (*e)->getLanes().begin(); l != (*e)->getLanes().end(); ++l) {
275 (*l)->setPermissions(i->permissions, i->id);
277 (*e)->rebuildAllowedLanes();
279 for (std::vector<MSLane*>::iterator l = i->closedLanes.begin(); l != i->closedLanes.end(); ++l) {
280 (*l)->setPermissions(i->permissions, i->id);
281 (*l)->getEdge().rebuildAllowedLanes();
286 if (i->end == currentTime && !(i->closed.empty() && i->closedLanes.empty()) && i->permissions !=
SVCAll) {
287 for (MSEdgeVector::iterator e = i->closed.begin(); e != i->closed.end(); ++e) {
288 for (std::vector<MSLane*>::const_iterator l = (*e)->getLanes().begin(); l != (*e)->getLanes().end(); ++l) {
289 (*l)->resetPermissions(i->id);
292 (*e)->rebuildAllowedLanes();
294 for (std::vector<MSLane*>::iterator l = i->closedLanes.begin(); l != i->closedLanes.end(); ++l) {
295 (*l)->resetPermissions(i->id);
296 (*l)->getEdge().rebuildAllowedLanes();
307 if (i->begin <= time && i->end > time) {
310 i->edgeProbs.getOverallProb() > 0 ||
312 i->routeProbs.getOverallProb() > 0 ||
314 i->parkProbs.getOverallProb() > 0 ||
330 if (i->begin <= time && i->end > time) {
331 if (i->parkProbs.getOverallProb() != 0 || i->edgeProbs.getOverallProb() != 0 || i->routeProbs.getOverallProb() != 0 || !i->closed.empty()) {
359 if (rerouteDef == 0) {
368 if (rerouteDef->
closedLanes.size() > 0 && !hasReroutingDevice) {
374 #ifdef DEBUG_REROUTER 382 if (newParkingArea != 0) {
399 if (edgesFromPark.size() > 0) {
400 edges.insert(edges.end(), edgesFromPark.begin() + 1, edgesFromPark.end());
403 veh.replaceRouteEdges(edges,
false,
false,
false);
404 std::string errorMsg;
405 if (!veh.replaceParkingArea(newParkingArea, errorMsg)) {
407 +
"' could not reroute to new parkingArea '" + newParkingArea->
getID()
418 #ifdef DEBUG_REROUTER 420 std::cout <<
" replacedRoute from routeDist " << newRoute->
getID() <<
"\n";
426 const MSEdge* newEdge = lastEdge;
428 double newArrivalPos = -1;
429 const bool destUnreachable = std::find(rerouteDef->
closed.begin(), rerouteDef->
closed.end(), lastEdge) != rerouteDef->
closed.end();
432 if (rerouteDef->
closed.size() == 0 || destUnreachable) {
442 WRITE_WARNING(
"Cannot keep destination edge '" + lastEdge->
getID() +
"' for vehicle '" + veh.
getID() +
"' due to closed edges. Terminating route.");
447 }
else if (newEdge == 0) {
448 #ifdef DEBUG_REROUTER 450 std::cout <<
" could not find new edge!\n";
465 const bool useNewRoute = veh.replaceRouteEdges(edges);
466 #ifdef DEBUG_REROUTER 467 if (
DEBUGCOND) std::cout <<
" rerouting: newEdge=" << newEdge->
getID() <<
" useNewRoute=" << useNewRoute <<
" newArrivalPos=" << newArrivalPos <<
" numClosed=" << rerouteDef->
closed.size()
468 <<
" destUnreachable=" << destUnreachable <<
" containsClosed=" << veh.getRoute().containsAnyOf(rerouteDef->
closed) <<
"\n";
470 if (useNewRoute && newArrivalPos != -1) {
472 veh.setArrivalPos(newArrivalPos);
529 return defaultWeight;
544 if (destParkArea != 0 &&
547 typedef std::map<std::string, double> ParkingParamMap_t;
548 typedef std::map<MSParkingArea*, ParkingParamMap_t> MSParkingAreaMap_t;
550 ParkingParamMap_t weights;
553 weights[
"probability"] =
getWeight(veh,
"parking.probability.weight", 0.0);
556 weights[
"capacity"] =
getWeight(veh,
"parking.capacity.weight", 0.0);
559 weights[
"absfreespace"] =
getWeight(veh,
"parking.absfreespace.weight", 0.0);
562 weights[
"relfreespace"] =
getWeight(veh,
"parking.relfreespace.weight", 0.0);
565 weights[
"distanceto"] =
getWeight(veh,
"parking.distanceto.weight",
getWeight(veh,
"parking.distance.weight", 1.0));
568 weights[
"timeto"] =
getWeight(veh,
"parking.timeto.weight", 0.0);
571 weights[
"distancefrom"] =
getWeight(veh,
"parking.distancefrom.weight", 0.0);
574 weights[
"timefrom"] =
getWeight(veh,
"parking.timefrom.weight", 0.0);
577 ParkingParamMap_t maxValues;
579 maxValues[
"probability"] = 0.0;
580 maxValues[
"capacity"] = 0.0;
581 maxValues[
"absfreespace"] = 0.0;
582 maxValues[
"relfreespace"] = 0.0;
583 maxValues[
"distanceto"] = 0.0;
584 maxValues[
"timeto"] = 0.0;
585 maxValues[
"distancefrom"] = 0.0;
586 maxValues[
"timefrom"] = 0.0;
589 MSParkingAreaMap_t parkAreas;
596 for (
int i = 0; i < (int)parks.size(); ++i) {
598 const double prob = probs[i];
602 ParkingParamMap_t parkValues;
613 if (edgesToPark.size() > 0) {
618 if (edgesFromPark.size() > 0) {
620 parkValues[
"probability"] = prob;
622 if (parkValues[
"probability"] > maxValues[
"probability"]) {
623 maxValues[
"probability"] = parkValues[
"probability"];
626 parkValues[
"capacity"] = (double)(pa->
getCapacity());
628 parkValues[
"relfreespace"] = parkValues[
"absfreespace"] / parkValues[
"capacity"];
630 if (parkValues[
"capacity"] > maxValues[
"capacity"]) {
631 maxValues[
"capacity"] = parkValues[
"capacity"];
634 if (parkValues[
"absfreespace"] > maxValues[
"absfreespace"]) {
635 maxValues[
"absfreespace"] = parkValues[
"absfreespace"];
638 if (parkValues[
"relfreespace"] > maxValues[
"relfreespace"]) {
639 maxValues[
"relfreespace"] = parkValues[
"relfreespace"];
646 routeToPark.begin(), routeToPark.end(), includeInternalLengths);
651 if (parkValues[
"distanceto"] > maxValues[
"distanceto"]) {
652 maxValues[
"distanceto"] = parkValues[
"distanceto"];
655 if (parkValues[
"timeto"] > maxValues[
"timeto"]) {
656 maxValues[
"timeto"] = parkValues[
"timeto"];
663 routeFromPark.begin(), routeFromPark.end(), includeInternalLengths);
668 if (parkValues[
"distancefrom"] > maxValues[
"distancefrom"]) {
669 maxValues[
"distancefrom"] = parkValues[
"distancefrom"];
672 if (parkValues[
"timefrom"] > maxValues[
"timefrom"]) {
673 maxValues[
"timefrom"] = parkValues[
"timefrom"];
676 parkAreas[pa] = parkValues;
683 double minParkingCost = 0.0;
685 for (MSParkingAreaMap_t::iterator it = parkAreas.begin(); it != parkAreas.end(); ++it) {
687 ParkingParamMap_t parkValues = it->second;
690 parkValues[
"probability"] = maxValues[
"probability"] > 0.0 ? 1.0 - parkValues[
"probability"] / maxValues[
"probability"] : 0.0;
691 parkValues[
"capacity"] = maxValues[
"capacity"] > 0.0 ? 1.0 - parkValues[
"capacity"] / maxValues[
"capacity"] : 0.0;
692 parkValues[
"absfreespace"] = maxValues[
"absfreespace"] > 0.0 ? 1.0 - parkValues[
"absfreespace"] / maxValues[
"absfreespace"] : 0.0;
693 parkValues[
"relfreespace"] = maxValues[
"relfreespace"] > 0.0 ? 1.0 - parkValues[
"relfreespace"] / maxValues[
"relfreespace"] : 0.0;
695 parkValues[
"distanceto"] = maxValues[
"distanceto"] > 0.0 ? parkValues[
"distanceto"] / maxValues[
"distanceto"] : 0.0;
696 parkValues[
"timeto"] = maxValues[
"timeto"] > 0.0 ? parkValues[
"timeto"] / maxValues[
"timeto"] : 0.0;
698 parkValues[
"distancefrom"] = maxValues[
"distancefrom"] > 0.0 ? parkValues[
"distancefrom"] / maxValues[
"distancefrom"] : 0.0;
699 parkValues[
"timefrom"] = maxValues[
"timefrom"] > 0.0 ? parkValues[
"timefrom"] / maxValues[
"timefrom"] : 0.0;
702 double parkingCost = 0.0;
705 for (ParkingParamMap_t::iterator pc = parkValues.begin(); pc != parkValues.end(); ++pc) {
706 parkingCost += weights[pc->first] * pc->second;
710 if (nearParkArea == 0 || parkingCost < minParkingCost) {
711 minParkingCost = parkingCost;
712 nearParkArea = it->first;
virtual MSLane * getLane() const =0
Returns the lane the vehicle is on.
A lane area vehicles can halt at.
int getCapacity() const
Returns the area capacity.
int getOccupancy() const
Returns the area occupancy.
MSEdge & getEdge() const
Returns the lane's edge.
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.
virtual MSParkingArea * getNextParkingArea()=0
MESegment * getSegmentForEdge(const MSEdge &e, double pos=0)
Get the segment for a given edge at a given position.
T get(std::mt19937 *which=0) const
Draw a sample of the distribution.
MSParkingArea * getParkingArea(const std::string &id) const
Returns the named parking area.
SUMOTime myCurrentIntervalEnd
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.
lane of a reroute of type closing
const MSEdge * getLastEdge() const
returns the destination edge
SUMOTime myCurrentIntervalBegin
The first and the last time steps of the interval.
std::vector< MSLane * > myCurrentClosedLanes
List of closed lanes.
bool hasInternalLinks() const
return whether the network contains internal links
double getWeight(SUMOVehicle &veh, const std::string param, const double defaultWeight) const
static double rand(std::mt19937 *rng=0)
Returns a random real number in [0, 1)
Notification
Definition of a vehicle state.
std::string time2string(SUMOTime t)
A device that performs vehicle rerouting based on current edge speeds.
virtual const MSEdge * getEdge() const =0
Returns the edge the vehicle is currently at.
weights: time range begin
static MSNet * getInstance()
Returns the pointer to the unique instance of MSNet (singleton).
double getOverallProb() const
Return the sum of the probabilites assigned to the members.
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 double getPositionOnLane() const =0
Get the vehicle's position along the lane.
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...
void setUserUsageProbability(double prob)
Sets the probability with which a vehicle is rerouted given by the user.
const std::vector< double > & getProbs() const
Returns the probabilities assigned to the members of the distribution.
std::vector< const MSEdge * > ConstMSEdgeVector
const SVCPermissions SVCAll
all VClasses are allowed
void setUserMode(bool val)
Sets whether the process is currently steered by the user.
const std::vector< SUMOVehicleParameter::Stop > & getStops() const
Returns the stops.
const std::string & getParameter(const std::string &key, const std::string &defaultValue) const
Returns the value for a given key.
SAX-handler base for SUMO-files.
SUMOTime getCurrentTimeStep() const
Returns the current simulation step.
MSTriggeredRerouter(const std::string &id, const MSEdgeVector &edges, double prob, const std::string &file, bool off)
Constructor.
double myProbability
The probability and the user-given probability.
#define WRITE_WARNING(msg)
const std::vector< T > & getVals() const
Returns the members of the distribution.
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.
virtual std::string getStringSecure(int id, const std::string &def) const =0
Returns the string-value of the named (by its enum-value) attribute.
const std::string & getID() const
Returns the id.
A road/street connecting two junctions.
virtual void myEndElement(int element)
Called when a closing tag occurs.
The vehicle changes lanes (micro only)
const MSLane & getLane() const
Returns the lane this stop is located at.
const SUMOVTypeParameter & getParameter() const
An abstract device that changes the state of the micro simulation.
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.
RandomDistributor< MSParkingArea * > myCurrentParkProb
new destinations with probabilities
virtual void addEvent(Command *operation, SUMOTime execTimeStep=-1)
Adds an Event.
RandomDistributor< const MSRoute * > myCurrentRouteProb
new routes with probabilities
static MSEdge mySpecialDest_keepDestination
special destination values
void addDetector(MSMoveReminder *data)
Adds a data collector for a detector to this segment.
virtual double getArrivalPos() const =0
Returns this vehicle's desired arrivalPos for its current route (may change on reroute) ...
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
virtual const MSVehicleType & getVehicleType() const =0
Returns the vehicle's type.
const RerouteInterval * getCurrentReroute(SUMOTime time, SUMOVehicle &veh) const
Returns the rerouting definition valid for the given time and vehicle, 0 if none. ...
bool notifyEnter(SUMOVehicle &veh, MSMoveReminder::Notification reason, const MSLane *enteredLane=0)
Tries to reroute the vehicle.
virtual bool hasAttribute(int id) const =0
Returns the information whether the named (by its enum-value) attribute is within the current list...
bool notifyLeave(SUMOVehicle &veh, double lastPos, MSMoveReminder::Notification reason, const MSLane *enteredLane=0)
Removes the reminder.
SUMOAbstractRouter< MSEdge, SUMOVehicle > & getRouterTT(const MSEdgeVector &prohibited=MSEdgeVector()) const
RandomDistributor< MSEdge * > myCurrentEdgeProb
new destinations with probabilities
void clear()
Clears the distribution.
double getProbability() const
Returns the rerouting probability.
entry for an alternative parking zone
virtual double recomputeCosts(const std::vector< const E * > &edges, const V *const v, SUMOTime msTime) const =0
static bool dictionary(const std::string &id, MSLane *lane)
Static (sic!) container methods {.
RandomDistributor< MSParkingArea * > parkProbs
The distributions of new parking areas to use as destinations.
virtual const MSRoute & getRoute() const =0
Returns the current route.
bool inUserMode() const
Returns whether the user is setting the rerouting probability.
SUMOTime end
The end time these definitions are valid.
std::vector< MSLane * > closedLanes
The list of closed lanes.
RandomDistributor< const MSRoute * > routeProbs
The distributions of new routes to use.
A single mesoscopic segment (cell)
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
MSEdgeVector myCurrentClosed
List of closed edges.
virtual const std::string & getID() const =0
Get the vehicle's ID.
bool myAmInUserMode
Information whether the current rerouting probability is the user-given.
static MELoop * gMesoNet
mesoscopic simulation infrastructure
double getBeginLanePosition() const
Returns the begin position of this stop.
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...
virtual const SUMOVehicleParameter & getParameter() const =0
Returns the vehicle's parameter (including departure definition)
an aggreagated-output interval
const RGBColor & getColor() const
Returns the color.
virtual void myStartElement(int element, const SUMOSAXAttributes &attrs)
Called on the opening of a tag;.
MSParkingArea * rerouteParkingZone(const MSTriggeredRerouter::RerouteInterval *rerouteDef, SUMOVehicle &veh) const
double getUserProbability() const
Returns the rerouting probability given by the user.
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.
bool knowsParameter(const std::string &key) const
Returns whether the parameter is known.
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...
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.
MSEdgeVector closedLanesAffected
The list of edges that are affect by closed lanes.
static bool dictionary(const std::string &id, const MSRoute *route)
Adds a route to the dictionary.
bool containsAnyOf(const MSEdgeVector &edgelist) const
virtual MSDevice * getDevice(const std::type_info &type) const =0
Returns a device of the given type if it exists or 0.