48 #ifdef CHECK_MEMORY_LEAKS 50 #endif // CHECK_MEMORY_LEAKS 82 oc.
addSynonyme(
"device.rerouting.period",
"device.routing.period",
true);
83 oc.
addDescription(
"device.rerouting.period",
"Routing",
"The period with which the vehicle shall be rerouted");
86 oc.
addSynonyme(
"device.rerouting.pre-period",
"device.routing.pre-period",
true);
87 oc.
addDescription(
"device.rerouting.pre-period",
"Routing",
"The rerouting period before depart");
90 oc.
addSynonyme(
"device.rerouting.adaptation-weight",
"device.routing.adaptation-weight",
true);
91 oc.
addDescription(
"device.rerouting.adaptation-weight",
"Routing",
"The weight of prior edge weights");
94 oc.
addSynonyme(
"device.rerouting.adaptation-interval",
"device.routing.adaptation-interval",
true);
95 oc.
addDescription(
"device.rerouting.adaptation-interval",
"Routing",
"The interval for updating the edge weights");
98 oc.
addSynonyme(
"device.rerouting.with-taz",
"device.routing.with-taz",
true);
99 oc.
addSynonyme(
"device.rerouting.with-taz",
"with-taz");
100 oc.
addDescription(
"device.rerouting.with-taz",
"Routing",
"Use zones (districts) as routing start- and endpoints");
103 oc.
addDescription(
"device.rerouting.init-with-loaded-weights",
"Routing",
"Use given weight files for initializing edge weights");
106 oc.
addDescription(
"device.rerouting.shortest-path-file",
"Routing",
"Initialize lookup table for astar from the given distance matrix");
109 oc.
addDescription(
"device.rerouting.threads",
"Routing",
"The number of parallel execution threads used for rerouting");
112 oc.
addDescription(
"device.rerouting.output",
"Routing",
"Save adapting weights to FILE");
126 if (!needRerouting && oc.
getFloat(
"device.rerouting.probability") == 0 && !oc.
isSet(
"device.rerouting.explicit")) {
138 const bool useLoaded = oc.
getBool(
"device.rerouting.init-with-loaded-weights");
140 for (MSEdgeVector::const_iterator i = edges.begin(); i != edges.end(); ++i) {
141 while ((*i)->getNumericalID() >= (int)
myEdgeEfforts.size()) {
147 myEdgeEfforts[(*i)->getNumericalID()] = (*i)->getCurrentTravelTime();
153 WRITE_ERROR(
"weights.random-factor cannot be less than 1");
156 if (oc.
getInt(
"device.rerouting.threads") > 1) {
157 WRITE_ERROR(
"Parallel routing is only possible when compiled with Fox.");
165 WRITE_ERROR(
"Negative value for device.rerouting.adaptation-interval!");
168 if (myAdaptationWeight < 0. || myAdaptationWeight > 1.) {
169 WRITE_ERROR(
"The value for device.rerouting.adaptation-weight must be between 0 and 1!");
171 if (myAdaptationWeight < 1. && myAdaptationInterval > 0) {
175 }
else if (period > 0) {
176 WRITE_WARNING(
"Rerouting is useless if the edge weights do not get updated!");
238 const std::pair<const MSEdge*, const MSEdge*> key = std::make_pair(source, dest);
286 std::map<std::pair<const MSEdge*, const MSEdge*>,
const MSRoute*>::iterator it =
myCachedRoutes.begin();
288 it->second->release();
293 for (MSEdgeVector::const_iterator i = edges.begin(); i != edges.end(); ++i) {
294 const int id = (*i)->getNumericalID();
295 const SUMOReal currTT = (*i)->getCurrentTravelTime();
307 for (MSEdgeVector::const_iterator i = edges.begin(); i != edges.end(); ++i) {
308 const int id = (*i)->getNumericalID();
328 const bool needThread = (
myRouter == 0 && myThreadPool.isFull());
330 const bool needThread =
true;
334 const std::string routingAlgorithm = oc.
getString(
"routing-algorithm");
336 if (routingAlgorithm ==
"dijkstra") {
337 if (mayHaveRestrictions) {
344 }
else if (routingAlgorithm ==
"astar") {
345 if (mayHaveRestrictions) {
347 const AStar::LookupTable* lookup = 0;
348 if (oc.
isSet(
"device.rerouting.shortest-path-file")) {
354 const AStar::LookupTable* lookup = 0;
355 if (oc.
isSet(
"device.rerouting.shortest-path-file")) {
360 }
else if (routingAlgorithm ==
"CH") {
362 if (mayHaveRestrictions) {
369 }
else if (routingAlgorithm ==
"CHWrapper") {
375 throw ProcessError(
"Unknown routing algorithm '" + routingAlgorithm +
"'!");
381 if (myThreadPool.size() < numThreads) {
382 new WorkerThread(myThreadPool,
myRouter);
384 if (myThreadPool.size() < numThreads) {
388 if (myThreadPool.size() > 0) {
389 myThreadPool.add(
new RoutingTask(
myHolder, currentTime, onInit));
414 if (myThreadPool.size() > 0) {
417 myThreadPool.clear();
430 MSDevice_Routing::waitForAll() {
431 if (myThreadPool.size() > 0) {
432 myThreadPool.waitAll();
442 myVehicle.reroute(myTime, static_cast<WorkerThread*>(context)->getRouter(), myOnInit,
myWithTaz);
443 const MSEdge* source = *myVehicle.getRoute().begin();
444 const MSEdge* dest = myVehicle.getRoute().getLastEdge();
446 const std::pair<const MSEdge*, const MSEdge*> key = std::make_pair(source, dest);
450 myVehicle.getRoute().addReference();
Computes the shortest path through a contracted network.
SUMOTime myPeriod
The period with which a vehicle shall be rerouted.
void doRegister(const std::string &name, Option *v)
Adds an option under the given name.
OutputDevice & writeAttr(const SumoXMLAttr attr, const T &val)
writes a named attribute
const int VEHPARS_FORCE_REROUTE
SUMOTime mySkipRouting
The time for which routing may be skipped because we cannot be inserted.
virtual const MSRoute & getRoute() const =0
Returns the current route.
static SUMOTime adaptEdgeEfforts(SUMOTime currentTime)
Adapt edge efforts by the current edge states.
SUMOVehicle & myHolder
The vehicle that stores the device.
static SUMOTime myAdaptationInterval
At which time interval the edge weights get updated.
const MSEdge * getLastEdge() const
returns the destination edge
bool getBool(const std::string &name) const
Returns the boolean-value of the named option (only for Option_Bool)
SUMOTime myLastRouting
The last time a routing took place.
MSDevice_Routing(SUMOVehicle &holder, const std::string &id, SUMOTime period, SUMOTime preInsertionPeriod)
Constructor.
Notification
Definition of a vehicle state.
static SUMOReal rand()
Returns a random real number in [0, 1)
Computes the shortest path through a network using the A* algorithm.
static void buildVehicleDevices(SUMOVehicle &v, std::vector< MSDevice * > &into)
Build devices for the given vehicle, if needed.
SUMOTime myPreInsertionPeriod
The period with which a vehicle shall be rerouted before insertion.
static MSNet * getInstance()
Returns the pointer to the unique instance of MSNet (singleton).
SUMOTime wrappedRerouteCommandExecute(SUMOTime currentTime)
Performs rerouting after a period.
SUMOReal getFloat(const std::string &name) const
Returns the SUMOReal-value of the named option (only for Option_Float)
static Command * myEdgeWeightSettingCommand
The weights adaptation/overwriting command.
Base (microsim) event class.
SUMOTime getCurrentTimeStep() const
Returns the current simulation step.
#define WRITE_WARNING(msg)
Computes the shortest path through a network using the Dijkstra algorithm.
static OptionsCont & getOptions()
Retrieves the options.
void addSynonyme(const std::string &name1, const std::string &name2, bool isDeprecated=false)
Adds a synonyme for an options name (any order)
std::string getString(const std::string &name) const
Returns the string-value of the named option (only for Option_String)
A road/street connecting two junctions.
virtual SUMOVehicleClass getVClass() const =0
Returns the vehicle's access class.
static void insertOptions(OptionsCont &oc)
Inserts MSDevice_Routing-options.
static bool myWithTaz
whether taz shall be used at initial rerouting
SUMOReal getLength() const
return the length of the edge
void reroute(const SUMOTime currentTime, const bool onInit=false)
initiate the rerouting, create router / thread pool on first use
The edge is a district edge.
Representation of a vehicle.
bool wasSet(int what) const
Returns whether the given parameter was set.
MSEventControl * getBeginOfTimestepEvents()
Returns the event control for events executed at the begin of a time step.
virtual void reroute(SUMOTime t, SUMOAbstractRouter< MSEdge, SUMOVehicle > &router, const bool onInit=false, const bool withTaz=false)=0
Performs a rerouting using the given router.
static SUMOReal getTravelTime(const MSEdge *const e, const SUMOVehicle *const v, SUMOReal t)
Returns the travel time to pass an edge.
static std::map< std::pair< const MSEdge *, const MSEdge * >, const MSRoute * > myCachedRoutes
The container of pre-calculated routes.
SUMOTime depart
The vehicle's departure time.
A wrapper for a Command function.
SUMOTime string2time(const std::string &r)
WrappingCommand< MSDevice_Routing > * myRerouteCommand
The (optional) command responsible for rerouting.
static void insertDefaultAssignmentOptions(const std::string &deviceName, const std::string &optionsTopic, OptionsCont &oc)
Adds common command options that allow to assign devices to vehicles.
virtual SUMOTime addEvent(Command *operation, SUMOTime execTimeStep, AdaptType type)
Adds an Event.
static SUMOReal getEffort(const MSEdge *const e, const SUMOVehicle *const v, SUMOReal t)
Returns the effort to pass an edge.
MSEventControl * getEndOfTimestepEvents()
Returns the event control for events executed at the end of a time step.
Abstract in-vehicle device.
static bool equippedByDefaultAssignmentOptions(const OptionsCont &oc, const std::string &deviceName, SUMOVehicle &v)
Determines whether a vehicle should get a certain device.
static SUMOReal getAssumedSpeed(const MSEdge *edge)
return current travel speed assumption
A pool of worker threads which distributes the tasks and collects the results.
EdgeBasicFunction getPurpose() const
Returns the edge type (EdgeBasicFunction)
The vehicle has departed (was inserted into the network)
static std::vector< SUMOReal > myEdgeEfforts
The container of edge efforts.
int getNumericalID() const
Returns the numerical id of the edge.
void deschedule()
Marks this Command as being descheduled.
static SUMOAbstractRouter< MSEdge, SUMOVehicle > * myRouter
The router to use.
static const MSEdgeVector & getAllEdges()
Returns all edges with a numerical id.
static OutputDevice & getDeviceByOption(const std::string &name)
Returns the device described by the option.
virtual const SUMOVehicleParameter & getParameter() const =0
Returns the vehicle's parameter (including departure definition)
A storage for options typed value containers)
virtual bool replaceRoute(const MSRoute *route, bool onInit=false, int offset=0)=0
Replaces the current route by the given one.
MSEventControl * getInsertionEvents()
Returns the event control for insertion events.
void prohibit(const std::vector< E * > &toProhibit)
bool notifyEnter(SUMOVehicle &veh, MSMoveReminder::Notification reason)
Computes a new route on vehicle insertion.
static bool createDeviceByOption(const std::string &optionName, const std::string &rootElement="", const std::string &schemaFile="")
Creates the device using the output definition stored in the named option.
~MSDevice_Routing()
Destructor.
Patch the time in a way that it is at least as high as the simulation begin time. ...
Static storage of an output device and its base (abstract) implementation.
static void cleanup()
deletes the router instance
bool closeTag()
Closes the most recently opened tag.
SUMOReal getMinimumTravelTime(const SUMOVehicle *const veh) const
returns the minimum travel time for the given vehicle
A thread repeatingly calculating incoming tasks.
MSEdgeControl & getEdgeControl()
Returns the edge control.
static AStarRouter< MSEdge, SUMOVehicle, prohibited_withPermissions< MSEdge, SUMOVehicle > > * myRouterWithProhibited
The router to use by rerouter elements.
static SUMOReal myAdaptationWeight
Information which weight prior edge efforts have.
std::vector< MSEdge * > MSEdgeVector
static SUMOReal myRandomizeWeightsFactor
Whether to disturb edge weights dynamically.
void addDescription(const std::string &name, const std::string &subtopic, const std::string &description)
Adds a description for an option.
bool hasPermissions() const
Returns whether the network has specific vehicle class permissions.
static SUMOAbstractRouter< MSEdge, SUMOVehicle > & getRouterTT(const MSEdgeVector &prohibited=MSEdgeVector())
return the router instance
int getInt(const std::string &name) const
Returns the int-value of the named option (only for Option_Integer)
static SUMOTime myLastAdaptation
Information when the last edge weight adaptation occured.
virtual const std::string & getID() const =0
Get the vehicle's ID.
OutputDevice & openTag(const std::string &xmlElement)
Opens an XML tag.
MSRouteIterator begin() const
Returns the begin of the list of edges to pass.
SUMOTime preInsertionReroute(const SUMOTime currentTime)
Performs rerouting before insertion into the network.
const MSEdgeVector & getEdges() const
Returns loaded edges.
bool isSet(const std::string &name, bool failOnNonExistant=true) const
Returns the information whether the named option is set.
Computes the shortest path through a contracted network.