63 #define DEBUGCOND (veh.isSelected()) 76 double prob,
const std::string& file,
bool off,
82 myUserProbability(prob),
83 myAmInUserMode(false),
84 myTimeThreshold(timeThreshold) {
86 for (MSEdgeVector::const_iterator j = edges.begin(); j != edges.end(); ++j) {
92 const std::vector<MSLane*>& destLanes = (*j)->getLanes();
93 for (std::vector<MSLane*>::const_iterator i = destLanes.begin(); i != destLanes.end(); ++i) {
94 (*i)->addMoveReminder(
this);
121 throw ProcessError(
"MSTriggeredRerouter " +
getID() +
": No destination edge id given.");
125 if (dest ==
"keepDestination") {
127 }
else if (dest ==
"terminateRoute") {
130 throw ProcessError(
"MSTriggeredRerouter " +
getID() +
": Destination edge '" + dest +
"' is not known.");
140 throw ProcessError(
"MSTriggeredRerouter " +
getID() +
": Attribute 'probability' for destination '" + dest +
"' is negative (must not).");
152 throw ProcessError(
"MSTriggeredRerouter " +
getID() +
": Edge '" + closed_id +
"' to close is not known.");
166 throw ProcessError(
"MSTriggeredRerouter " +
getID() +
": Lane '" + closed_id +
"' to close is not known.");
185 if (routeStr ==
"") {
190 throw ProcessError(
"MSTriggeredRerouter " +
getID() +
": Route '" + routeStr +
"' does not exist.");
200 throw ProcessError(
"MSTriggeredRerouter " +
getID() +
": Attribute 'probability' for route '" + routeStr +
"' is negative (must not).");
210 if (parkingarea ==
"") {
211 throw ProcessError(
"MSTriggeredRerouter " +
getID() +
": No parking area id given.");
215 throw ProcessError(
"MSTriggeredRerouter " +
getID() +
": Parking area '" + parkingarea +
"' is not known.");
224 throw ProcessError(
"MSTriggeredRerouter " +
getID() +
": Attribute 'probability' for destination '" + parkingarea +
"' is negative (must not).");
248 std::set<MSEdge*> affected;
250 affected.insert(&((*l)->getEdge()));
275 if (i->begin == currentTime && !(i->closed.empty() && i->closedLanes.empty()) && i->permissions !=
SVCAll) {
276 for (MSEdgeVector::iterator e = i->closed.begin(); e != i->closed.end(); ++e) {
277 for (std::vector<MSLane*>::const_iterator l = (*e)->getLanes().begin(); l != (*e)->getLanes().end(); ++l) {
279 (*l)->setPermissions(i->permissions, i->id);
281 (*e)->rebuildAllowedLanes();
283 for (std::vector<MSLane*>::iterator l = i->closedLanes.begin(); l != i->closedLanes.end(); ++l) {
284 (*l)->setPermissions(i->permissions, i->id);
285 (*l)->getEdge().rebuildAllowedLanes();
290 if (i->end == currentTime && !(i->closed.empty() && i->closedLanes.empty()) && i->permissions !=
SVCAll) {
291 for (MSEdgeVector::iterator e = i->closed.begin(); e != i->closed.end(); ++e) {
292 for (std::vector<MSLane*>::const_iterator l = (*e)->getLanes().begin(); l != (*e)->getLanes().end(); ++l) {
293 (*l)->resetPermissions(i->id);
296 (*e)->rebuildAllowedLanes();
298 for (std::vector<MSLane*>::iterator l = i->closedLanes.begin(); l != i->closedLanes.end(); ++l) {
299 (*l)->resetPermissions(i->id);
300 (*l)->getEdge().rebuildAllowedLanes();
311 if (i->begin <= time && i->end > time) {
314 i->edgeProbs.getOverallProb() > 0 ||
316 i->routeProbs.getOverallProb() > 0 ||
318 i->parkProbs.getOverallProb() > 0 ||
334 if (i->begin <= time && i->end > time) {
335 if (i->parkProbs.getOverallProb() != 0 || i->edgeProbs.getOverallProb() != 0 || i->routeProbs.getOverallProb() != 0 || !i->closed.empty()) {
363 if (rerouteDef == 0) {
375 if (rerouteDef->
closedLanes.size() > 0 && !hasReroutingDevice) {
381 #ifdef DEBUG_REROUTER 388 bool newDestination =
false;
390 if (newParkingArea != 0) {
403 if (!newDestination) {
409 if (edgesFromPark.size() > 0) {
410 edges.insert(edges.end(), edgesFromPark.begin() + 1, edgesFromPark.end());
413 veh.replaceRouteEdges(edges,
false,
false,
false);
414 std::string errorMsg;
415 if (!veh.replaceParkingArea(newParkingArea, errorMsg)) {
417 +
"' could not reroute to new parkingArea '" + newParkingArea->
getID()
420 if (newDestination) {
431 #ifdef DEBUG_REROUTER 433 std::cout <<
" replacedRoute from routeDist " << newRoute->
getID() <<
"\n";
439 const MSEdge* newEdge = lastEdge;
441 double newArrivalPos = -1;
442 const bool destUnreachable = std::find(rerouteDef->
closed.begin(), rerouteDef->
closed.end(), lastEdge) != rerouteDef->
closed.end();
445 if (rerouteDef->
closed.size() == 0 || destUnreachable) {
455 WRITE_WARNING(
"Cannot keep destination edge '" + lastEdge->
getID() +
"' for vehicle '" + veh.
getID() +
"' due to closed edges. Terminating route.");
460 }
else if (newEdge == 0) {
461 #ifdef DEBUG_REROUTER 463 std::cout <<
" could not find new edge!\n";
478 const bool useNewRoute = veh.replaceRouteEdges(edges);
479 #ifdef DEBUG_REROUTER 480 if (
DEBUGCOND) std::cout <<
" rerouting: newEdge=" << newEdge->
getID() <<
" useNewRoute=" << useNewRoute <<
" newArrivalPos=" << newArrivalPos <<
" numClosed=" << rerouteDef->
closed.size()
481 <<
" destUnreachable=" << destUnreachable <<
" containsClosed=" << veh.getRoute().containsAnyOf(rerouteDef->
closed) <<
"\n";
483 if (useNewRoute && newArrivalPos != -1) {
485 veh.setArrivalPos(newArrivalPos);
542 return defaultWeight;
558 if (destParkArea != 0 &&
570 <<
" rerouteParkingArea dest=" << destParkArea->
getID()
571 <<
" newDest=" << newDestination
576 typedef std::map<std::string, double> ParkingParamMap_t;
577 typedef std::map<MSParkingArea*, ParkingParamMap_t> MSParkingAreaMap_t;
579 ParkingParamMap_t weights;
582 weights[
"probability"] =
getWeight(veh,
"parking.probability.weight", 0.0);
585 weights[
"capacity"] =
getWeight(veh,
"parking.capacity.weight", 0.0);
588 weights[
"absfreespace"] =
getWeight(veh,
"parking.absfreespace.weight", 0.0);
591 weights[
"relfreespace"] =
getWeight(veh,
"parking.relfreespace.weight", 0.0);
594 weights[
"distanceto"] =
getWeight(veh,
"parking.distanceto.weight",
getWeight(veh,
"parking.distance.weight", 1.0));
597 weights[
"timeto"] =
getWeight(veh,
"parking.timeto.weight", 0.0);
600 weights[
"distancefrom"] =
getWeight(veh,
"parking.distancefrom.weight", 0.0);
603 weights[
"timefrom"] =
getWeight(veh,
"parking.timefrom.weight", 0.0);
606 ParkingParamMap_t maxValues;
608 maxValues[
"probability"] = 0.0;
609 maxValues[
"capacity"] = 0.0;
610 maxValues[
"absfreespace"] = 0.0;
611 maxValues[
"relfreespace"] = 0.0;
612 maxValues[
"distanceto"] = 0.0;
613 maxValues[
"timeto"] = 0.0;
614 maxValues[
"distancefrom"] = 0.0;
615 maxValues[
"timefrom"] = 0.0;
618 MSParkingAreaMap_t parkAreas;
625 for (
int i = 0; i < (int)parks.size(); ++i) {
627 const double prob = probs[i];
631 ParkingParamMap_t parkValues;
642 if (edgesToPark.size() > 0) {
646 if (!newDestination) {
650 if (edgesFromPark.size() > 0 || newDestination) {
652 parkValues[
"probability"] = prob;
654 if (parkValues[
"probability"] > maxValues[
"probability"]) {
655 maxValues[
"probability"] = parkValues[
"probability"];
658 parkValues[
"capacity"] = (double)(pa->
getCapacity());
660 parkValues[
"relfreespace"] = parkValues[
"absfreespace"] / parkValues[
"capacity"];
662 if (parkValues[
"capacity"] > maxValues[
"capacity"]) {
663 maxValues[
"capacity"] = parkValues[
"capacity"];
666 if (parkValues[
"absfreespace"] > maxValues[
"absfreespace"]) {
667 maxValues[
"absfreespace"] = parkValues[
"absfreespace"];
670 if (parkValues[
"relfreespace"] > maxValues[
"relfreespace"]) {
671 maxValues[
"relfreespace"] = parkValues[
"relfreespace"];
678 routeToPark.begin(), routeToPark.end(), includeInternalLengths);
683 if (parkValues[
"distanceto"] > maxValues[
"distanceto"]) {
684 maxValues[
"distanceto"] = parkValues[
"distanceto"];
687 if (parkValues[
"timeto"] > maxValues[
"timeto"]) {
688 maxValues[
"timeto"] = parkValues[
"timeto"];
691 if (newDestination) {
692 parkValues[
"distancefrom"] = 0;
693 parkValues[
"timefrom"] = 0;
695 MSRoute routeFromPark(route.
getID() +
"!frompark#1", edgesFromPark,
false,
699 routeFromPark.begin(), routeFromPark.end(), includeInternalLengths);
704 if (parkValues[
"distancefrom"] > maxValues[
"distancefrom"]) {
705 maxValues[
"distancefrom"] = parkValues[
"distancefrom"];
708 if (parkValues[
"timefrom"] > maxValues[
"timefrom"]) {
709 maxValues[
"timefrom"] = parkValues[
"timefrom"];
712 parkAreas[pa] = parkValues;
716 std::cout <<
" altPA=" << pa->
getID()
728 std::cout <<
" maxValues=" <<
joinToString(maxValues,
" ",
":") <<
"\n";
733 double minParkingCost = 0.0;
735 for (MSParkingAreaMap_t::iterator it = parkAreas.begin(); it != parkAreas.end(); ++it) {
737 ParkingParamMap_t parkValues = it->second;
740 parkValues[
"probability"] = maxValues[
"probability"] > 0.0 ? 1.0 - parkValues[
"probability"] / maxValues[
"probability"] : 0.0;
741 parkValues[
"capacity"] = maxValues[
"capacity"] > 0.0 ? 1.0 - parkValues[
"capacity"] / maxValues[
"capacity"] : 0.0;
742 parkValues[
"absfreespace"] = maxValues[
"absfreespace"] > 0.0 ? 1.0 - parkValues[
"absfreespace"] / maxValues[
"absfreespace"] : 0.0;
743 parkValues[
"relfreespace"] = maxValues[
"relfreespace"] > 0.0 ? 1.0 - parkValues[
"relfreespace"] / maxValues[
"relfreespace"] : 0.0;
745 parkValues[
"distanceto"] = maxValues[
"distanceto"] > 0.0 ? parkValues[
"distanceto"] / maxValues[
"distanceto"] : 0.0;
746 parkValues[
"timeto"] = maxValues[
"timeto"] > 0.0 ? parkValues[
"timeto"] / maxValues[
"timeto"] : 0.0;
748 parkValues[
"distancefrom"] = maxValues[
"distancefrom"] > 0.0 ? parkValues[
"distancefrom"] / maxValues[
"distancefrom"] : 0.0;
749 parkValues[
"timefrom"] = maxValues[
"timefrom"] > 0.0 ? parkValues[
"timefrom"] / maxValues[
"timefrom"] : 0.0;
752 double parkingCost = 0.0;
755 for (ParkingParamMap_t::iterator pc = parkValues.begin(); pc != parkValues.end(); ++pc) {
756 parkingCost += weights[pc->first] * pc->second;
760 if (nearParkArea == 0 || parkingCost < minParkingCost) {
761 minParkingCost = parkingCost;
762 nearParkArea = it->first;
767 std::cout <<
" altPA=" << it->first->
getID() <<
" score=" << parkingCost <<
"\n";
A lane area vehicles can halt at.
double getProbability() const
Returns the rerouting probability.
MSEdgeVector closed
The list of closed edges.
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.
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
MSStoppingPlace * getStoppingPlace(const std::string &id, const SumoXMLTag category) const
Returns the named stopping place of the given category.
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.
virtual bool replaceRoute(const MSRoute *route, bool onInit=false, int offset=0, bool addStops=true, bool removeStops=true)=0
Replaces the current route by the given one.
std::vector< MSLane * > myCurrentClosedLanes
List of closed lanes.
static double rand(std::mt19937 *rng=0)
Returns a random real number in [0, 1)
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 std::string getIDSecure(const T *obj, const std::string &fallBack="NULL")
get an identifier for Named-like object which may be Null
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.
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.
#define WRITE_WARNING(msg)
A road/street connecting two junctions.
virtual void myEndElement(int element)
Called when a closing tag occurs.
double getEndLanePosition() const
Returns the end position of this stop.
The vehicle changes lanes (micro only)
MSTriggeredRerouter(const std::string &id, const MSEdgeVector &edges, double prob, const std::string &file, bool off, SUMOTime timeThreshold)
Constructor.
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.
T get(std::mt19937 *which=0) const
Draw a sample of the distribution.
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.
virtual SUMOTime getAccumulatedWaitingTime() const =0
SUMOTime getCurrentTimeStep() const
Returns the current simulation step.
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.
bool hasInternalLinks() const
return whether the network contains internal links
MSParkingArea * rerouteParkingArea(const MSTriggeredRerouter::RerouteInterval *rerouteDef, SUMOVehicle &veh, bool &newDestination) const
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.
RandomDistributor< MSEdge * > myCurrentEdgeProb
new destinations with probabilities
void clear()
Clears the distribution.
entry for an alternative parking zone
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.
const std::string getParameter(const std::string &key, const std::string &defaultValue="") const
Returns the value for a given key.
MSEdgeVector myCurrentClosed
List of closed edges.
bool myAmInUserMode
Information whether the current rerouting probability is the user-given.
static MELoop * gMesoNet
mesoscopic simulation infrastructure
virtual SUMOTime getWaitingTime() const =0
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.
std::string joinToString(const std::vector< T > &v, const T_BETWEEN &between, std::streamsize accuracy=gPrecision)
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.