86 if (myAdaptationWeight < 1. && myAdaptationInterval > 0) {
89 }
else if (period > 0) {
90 WRITE_WARNING(
"Rerouting is useless if the edge weights do not get updated!");
106 const bool useLoaded = oc.
getBool(
"device.rerouting.init-with-loaded-weights");
107 const double currentSecond =
SIMTIME;
109 while (edge->getNumericalID() >= (int)
myEdgeSpeeds.size()) {
118 myEdgeSpeeds[edge->getNumericalID()] = edge->getMeanSpeed();
165 std::map<std::pair<const MSEdge*, const MSEdge*>,
const MSRoute*>::iterator it =
myCachedRoutes.begin();
167 it->second->release();
173 for (MSEdgeVector::const_iterator i = edges.begin(); i != edges.end(); ++i) {
174 if ((*i)->isDelayed()) {
175 const int id = (*i)->getNumericalID();
176 const double currSpeed = (*i)->getMeanSpeed();
185 for (MSEdgeVector::const_iterator i = edges.begin(); i != edges.end(); ++i) {
186 if ((*i)->isDelayed()) {
187 const int id = (*i)->getNumericalID();
188 const double currSpeed = (*i)->getMeanSpeed();
202 for (
const MSEdge* e : edges) {
218 return routeIt->second;
227 const bool needThread = (
myRouter ==
nullptr && myThreadPool.isFull());
229 const bool needThread =
true;
231 if (needThread &&
myRouter ==
nullptr) {
233 const std::string routingAlgorithm = oc.
getString(
"routing-algorithm");
238 if (routingAlgorithm ==
"dijkstra") {
239 if (mayHaveRestrictions) {
246 }
else if (routingAlgorithm ==
"astar") {
247 if (mayHaveRestrictions) {
249 std::shared_ptr<const AStar::LookupTable> lookup;
250 if (oc.
isSet(
"astar.all-distances")) {
252 }
else if (oc.
isSet(
"astar.landmark-distances")) {
259 lookup = std::make_shared<const AStar::LMLT>(oc.
getString(
"astar.landmark-distances"),
MSEdge::getAllEdges(), &router, &vehicle,
"", oc.
getInt(
"device.rerouting.threads"));
260 vehicle.setChosenSpeedFactor(speedFactor);
265 std::shared_ptr<const AStar::LookupTable> lookup;
266 if (oc.
isSet(
"astar.all-distances")) {
267 lookup = std::shared_ptr<const AStar::LookupTable> (
new AStar::FLT(oc.
getString(
"astar.all-distances"), (int)
MSEdge::getAllEdges().size()));
268 }
else if (oc.
isSet(
"astar.landmark-distances")) {
275 lookup = std::make_shared<const AStar::LMLT>(oc.
getString(
"astar.landmark-distances"),
MSEdge::getAllEdges(), &router, &vehicle,
"", oc.
getInt(
"device.rerouting.threads"));
276 vehicle.setChosenSpeedFactor(speedFactor);
280 }
else if (routingAlgorithm ==
"CH") {
282 if (mayHaveRestrictions) {
289 }
else if (routingAlgorithm ==
"CHWrapper") {
295 throw ProcessError(
"Unknown routing algorithm '" + routingAlgorithm +
"'!");
301 if (myThreadPool.size() < numThreads) {
302 new WorkerThread(myThreadPool,
myRouter);
304 if (myThreadPool.size() < numThreads) {
308 if (myThreadPool.size() > 0) {
309 myThreadPool.add(
new RoutingTask(vehicle, currentTime, onInit));
353 if (myThreadPool.size() > 0) {
356 myThreadPool.clear();
369 MSRoutingEngine::waitForAll() {
370 if (myThreadPool.size() > 0) {
371 myThreadPool.waitAll();
381 myVehicle.reroute(myTime,
"device.rerouting", static_cast<WorkerThread*>(context)->getRouter(), myOnInit,
myWithTaz);
382 const MSEdge* source = *myVehicle.getRoute().begin();
383 const MSEdge* dest = myVehicle.getRoute().getLastEdge();
385 const std::pair<const MSEdge*, const MSEdge*> key = std::make_pair(source, dest);
389 myVehicle.getRoute().addReference();
Computes the shortest path through a contracted network.
OutputDevice & writeAttr(const SumoXMLAttr attr, const T &val)
writes a named attribute
static void setEdgeTravelTime(const MSEdge *const edge, const double travelTime)
adapt the known travel time for an edge
virtual void reroute(SUMOTime t, const std::string &info, SUMOAbstractRouter< MSEdge, SUMOVehicle > &router, const bool onInit=false, const bool withTaz=false, const bool silent=false)=0
Performs a rerouting using the given router.
static SUMOTime myLastAdaptation
Information when the last edge weight adaptation occurred.
static int myAdaptationSteps
The number of steps for averaging edge speeds (ring-buffer)
int getInt(const std::string &name) const
Returns the int-value of the named option (only for Option_Integer)
static double getEffortExtra(const MSEdge *const e, const SUMOVehicle *const v, double t)
static SUMOTime myAdaptationInterval
At which time interval the edge weights get updated.
bool hasPermissions() const
Returns whether the network has specific vehicle class permissions.
static int myAdaptationStepsIndex
The current index in the pastEdgeSpeed ring-buffer.
static AStarRouter< MSEdge, SUMOVehicle, SUMOAbstractRouterPermissions< MSEdge, SUMOVehicle > > * myRouterWithProhibited
The router to use by rerouter elements.
static SUMOAbstractRouter< MSEdge, SUMOVehicle >::Operation myEffortFunc
static void initWeightUpdate()
intialize period edge weight update
static double rand(std::mt19937 *rng=0)
Returns a random real number in [0, 1)
Computes the shortest path through a network using the A* algorithm.
weights: time range begin
const std::vector< MSLane * > & getLanes() const
Returns this edge's lanes.
static MSNet * getInstance()
Returns the pointer to the unique instance of MSNet (singleton).
virtual SUMOVehicleClass getVClass() const =0
Returns the vehicle's access class.
bool getBool(const std::string &name) const
Returns the boolean-value of the named option (only for Option_Bool)
bool isDefault(const std::string &name) const
Returns the information whether the named option has still the default value.
static SUMOAbstractRouter< MSEdge, SUMOVehicle > & getRouterTT(const MSEdgeVector &prohibited=MSEdgeVector())
return the router instance
Base (microsim) event class.
virtual double getChosenSpeedFactor() const =0
double getLength() const
return the length of the edge
int getNumericalID() const
Returns the numerical id of the edge.
static void initEdgeWeights()
initialize the edge weights if not done before
const MSEdge * getBidiEdge() const
return opposite superposable/congruent edge, if it exist and 0 else
static SUMOTime adaptEdgeEfforts(SUMOTime currentTime)
Adapt edge efforts by the current edge states.
#define WRITE_WARNING(msg)
static OptionsCont & getOptions()
Retrieves the options.
void prohibit(const std::vector< E *> &toProhibit)
A road/street connecting two junctions.
bool isSet(const std::string &name, bool failOnNonExistant=true) const
Returns the information whether the named option is set.
bool hasBidiEdges() const
return whether the network contains bidirectional rail edges
virtual void setChosenSpeedFactor(const double factor)=0
static const MSRoute * getCachedRoute(const std::pair< const MSEdge *, const MSEdge *> &key)
return the cached route or nullptr on miss
Representation of a vehicle.
Computes the shortest path through a network using the Dijkstra algorithm.
static double getTravelTime(const MSEdge *const e, const SUMOVehicle *const v, double t)
Returns the travel time to pass an edge.
std::string getString(const std::string &name) const
Returns the string-value of the named option (only for Option_String)
static double myAdaptationWeight
Information which weight prior edge efforts have.
double getMinimumTravelTime(const SUMOVehicle *const veh) const
returns the minimum travel time for the given vehicle
virtual void addEvent(Command *operation, SUMOTime execTimeStep=-1)
Adds an Event.
A wrapper for a Command function.
static void reroute(SUMOVehicle &vehicle, const SUMOTime currentTime, const bool onInit)
initiate the rerouting, create router / thread pool on first use
static std::vector< std::vector< double > > myPastEdgeSpeeds
The container of edge speeds.
SUMOTime getCurrentTimeStep() const
Returns the current simulation step.
SUMOTime string2time(const std::string &r)
static Command * myEdgeWeightSettingCommand
The weights adaptation/overwriting command.
double getFloat(const std::string &name) const
Returns the double-value of the named option (only for Option_Float)
double gWeightsRandomFactor
begin/end of the description of an edge
MSEventControl * getEndOfTimestepEvents()
Returns the event control for events executed at the end of a time step.
static std::vector< double > myEdgeSpeeds
The container of edge speeds.
A pool of worker threads which distributes the tasks and collects the results.
static SUMOAbstractRouter< MSEdge, SUMOVehicle > * myRouter
The router to use.
static std::map< std::pair< const MSEdge *, const MSEdge * >, const MSRoute * > myCachedRoutes
The container of pre-calculated routes.
bool isTazConnector() const
static double getAssumedSpeed(const MSEdge *edge)
return current travel speed assumption
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.
static double getEffort(const MSEdge *const e, const SUMOVehicle *const v, double t)
Returns the effort to pass an edge.
static bool myWithTaz
whether taz shall be used at initial rerouting
A storage for options typed value containers)
const MSEdgeVector & getEdges() const
Returns loaded edges.
an aggreagated-output interval
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.
Static storage of an output device and its base (abstract) implementation.
bool closeTag(const std::string &comment="")
Closes the most recently opened tag and optionally adds a comment.
A thread repeatingly calculating incoming tasks.
MSEdgeControl & getEdgeControl()
Returns the edge control.
static void cleanup()
deletes the router instance
std::vector< MSEdge * > MSEdgeVector
OutputDevice & openTag(const std::string &xmlElement)
Opens an XML tag.
Computes the shortest path through a contracted network.