49 #ifdef CHECK_MEMORY_LEAKS
51 #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.
addDescription(
"device.rerouting.with-taz",
"Routing",
"Use zones (districts) as routing end points");
102 oc.
addDescription(
"device.rerouting.init-with-loaded-weights",
"Routing",
"Use given weight files for initializing edge weights");
105 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");
121 if (!needRerouting && oc.
getFloat(
"device.rerouting.probability") == 0 && !oc.
isSet(
"device.rerouting.explicit")) {
134 const bool useLoaded = oc.
getBool(
"device.rerouting.init-with-loaded-weights");
136 for (std::vector<MSEdge*>::const_iterator i = edges.begin(); i != edges.end(); ++i) {
137 while ((*i)->getNumericalID() >= (int)
myEdgeEfforts.size()) {
143 myEdgeEfforts[(*i)->getNumericalID()] = (*i)->getCurrentTravelTime();
152 WRITE_ERROR(
"Negative value for device.rerouting.adaptation-interval!");
155 if (myAdaptationWeight < 0. || myAdaptationWeight > 1.) {
156 WRITE_ERROR(
"The value for device.rerouting.adaptation-weight must be between 0 and 1!");
158 if (myAdaptationWeight < 1. && myAdaptationInterval > 0) {
162 }
else if (period > 0) {
163 WRITE_WARNING(
"Rerouting is useless if the edge weights do not get updated!");
187 :
MSDevice(holder, id), myPeriod(period), myPreInsertionPeriod(preInsertionPeriod), myLastRouting(-1), mySkipRouting(-1), myRerouteCommand(0) {
234 if (source && dest) {
235 const std::pair<const MSEdge*, const MSEdge*> key = std::make_pair(source, dest);
271 std::map<std::pair<const MSEdge*, const MSEdge*>,
const MSRoute*>::iterator it =
myCachedRoutes.begin();
273 it->second->release();
278 for (std::vector<MSEdge*>::const_iterator i = edges.begin(); i != edges.end(); ++i) {
279 const int id = (*i)->getNumericalID();
280 const SUMOReal currTT = (*i)->getCurrentTravelTime();
298 const bool needThread = (
myRouter == 0 && myThreadPool.isFull());
300 const bool needThread =
true;
304 const std::string routingAlgorithm = oc.
getString(
"routing-algorithm");
306 if (routingAlgorithm ==
"dijkstra") {
307 if (mayHaveRestrictions) {
314 }
else if (routingAlgorithm ==
"astar") {
315 if (mayHaveRestrictions) {
317 const AStar::LookupTable* lookup = 0;
318 if (oc.
isSet(
"device.rerouting.shortest-path-file")) {
324 const AStar::LookupTable* lookup = 0;
325 if (oc.
isSet(
"device.rerouting.shortest-path-file")) {
330 }
else if (routingAlgorithm ==
"CH") {
332 if (mayHaveRestrictions) {
339 }
else if (routingAlgorithm ==
"CHWrapper") {
345 throw ProcessError(
"Unknown routing algorithm '" + routingAlgorithm +
"'!");
351 if (myThreadPool.size() < numThreads) {
352 new WorkerThread(myThreadPool,
myRouter);
354 if (myThreadPool.size() < numThreads) {
358 if (myThreadPool.size() > 0) {
359 myThreadPool.add(
new RoutingTask(
myHolder, currentTime, onInit));
370 if (myThreadPool.size() > 0) {
373 myThreadPool.clear();
386 MSDevice_Routing::waitForAll() {
387 if (myThreadPool.size() > 0) {
388 myThreadPool.waitAll();
398 myVehicle.reroute(myTime, static_cast<WorkerThread*>(context)->getRouter(), myOnInit);
402 const std::pair<const MSEdge*, const MSEdge*> key = std::make_pair(source, dest);
406 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.
const int VEHPARS_FORCE_REROUTE
SUMOTime mySkipRouting
The time for which routing may be skipped because we cannot be inserted.
static size_t numericalDictSize()
Returns the number of edges with a numerical id.
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.
virtual void reroute(SUMOTime t, SUMOAbstractRouter< MSEdge, SUMOVehicle > &router, bool withTaz=false)=0
Performs a rerouting using the given router.
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.
Computes the shortest path through a network using the Dijkstra 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).
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...
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.
std::string toTaz
The vehicle's destination zone (district)
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
void reroute(const SUMOTime currentTime, const bool onInit=false)
initiate the rerouting, create router / thread pool on first use
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.
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.
std::string fromTaz
The vehicle's origin zone (district)
void addOptionSubTopic(const std::string &topic)
Adds an option subtopic.
virtual SUMOTime addEvent(Command *operation, SUMOTime execTimeStep, AdaptType type)
Adds an Event.
bool hasRestrictions() const
Returns whether the network has vehicle class restrictions.
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.
A pool of worker threads which distributes the tasks and collects the results.
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.
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.
bool notifyEnter(SUMOVehicle &veh, MSMoveReminder::Notification reason)
Computes a new route on vehicle insertion.
const std::vector< MSEdge * > & getEdges() const
Returns loaded edges.
~MSDevice_Routing()
Destructor.
Patch the time in a way that it is at least as high as the simulation begin time. ...
static void cleanup()
deletes the router instance
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 SUMOReal myAdaptationWeight
Information which weight prior edge efforts have.
void addDescription(const std::string &name, const std::string &subtopic, const std::string &description)
Adds a description for an option.
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.
SUMOTime preInsertionReroute(const SUMOTime currentTime)
Performs rerouting before insertion into the network.
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.