20 #include "../MSEdge.h" 23 #define ANALYSIS_DBG(X) {X} 25 #define ANALYSIS_DBG(X) DBG(X) 29 const std::string& programID,
const Phases& phases,
int step,
SUMOTime delay,
30 const std::map<std::string, std::string>& parameters) :
34 std::transform(pols.begin(), pols.end(), pols.begin(), ::tolower);
35 DBG(std::ostringstream str; str <<
"policies: " << pols;
WRITE_MESSAGE(str.str());)
37 if (pols.find(
"platoon") != std::string::npos) {
40 if (pols.find(
"phase") != std::string::npos) {
43 if (pols.find(
"marching") != std::string::npos) {
46 if (pols.find(
"congestion") != std::string::npos) {
59 std::ostringstream d_str; d_str << getMaxCongestionDuration(); vector<MSSOTLPolicy*>
policies =
getPolicies();
61 WRITE_MESSAGE(
"getMaxCongestionDuration " + d_str.str());
for (
int i = 0; i < policies.size(); i++) {
64 std::ostringstream _str;
70 if (m_useVehicleTypesWeights && pols.find(
"phase") == std::string::npos) {
71 WRITE_ERROR(
"VEHICLE TYPES WEIGHT only works with phase policy, which is missing");
120 srand((
int) time(
nullptr));
123 MSLane* currentLane =
nullptr;
133 for (MSTrafficLightLogic::LaneVectorVector::const_iterator laneVector =
myLanes.begin();
134 laneVector !=
myLanes.end(); laneVector++) {
135 for (MSTrafficLightLogic::LaneVector::const_iterator lane = laneVector->begin(); lane != laneVector->end();
137 currentLane = (*lane);
146 WRITE_MESSAGE(
"MSSwarmTrafficLightLogic::init Intersection " +
getID() +
" pheromoneInputLanes adding " + currentLane->
getID());)
149 WRITE_MESSAGE(
"MSSwarmTrafficLightLogic::init Intersection " +
getID() +
" pheromoneInputLanes: lane " + currentLane->
getID() +
" not allowed");)
157 for (
int i = 0; i < (int)myLinks.size(); i++) {
159 for (
int j = 0; j < (int)oneLink.size(); j++) {
160 currentLane = oneLink[j]->getLane();
166 WRITE_MESSAGE(
"MSSwarmTrafficLightLogic::init Intersection " +
getID() +
" pheromoneOutputLanes adding " + currentLane->
getID());)
169 WRITE_MESSAGE(
"MSSwarmTrafficLightLogic::init Intersection " +
getID() +
" pheromoneOutputLanes lane " + currentLane->
getID() +
" not allowed");)
180 WRITE_MESSAGE(
"*** Intersection " +
getID() +
" will run using MSSwarmTrafficLightLogic ***");
182 logData = logFileName.compare(
"") != 0;
184 swarmLogFile.open(logFileName.c_str(), std::ios::out | std::ios::binary);
205 std::string laneId = laneIterator->first;
211 std::string laneId = laneIterator->first;
298 const double beta,
const double gamma) {
301 std::ostringstream _str; _str << logString <<
" Lanes " << pheroMap.size() <<
" TL " <<
getID() <<
" .";
WRITE_MESSAGE(
time2string(
MSNet::getInstance()->getCurrentTimeStep()) +
" MSSwarmTrafficLightLogic::updatePheromoneLevels:: " + _str.str());)
303 for (MSLaneId_PheromoneMap::iterator laneIterator = pheroMap.begin(); laneIterator != pheroMap.end();
305 std::string laneId = laneIterator->first;
306 double oldPhero = laneIterator->second;
309 bool updatePheromone = (meanVehiclesSpeed > -1);
313 double derivative = 0;
317 if (updatePheromone) {
318 double currentDerivative = 0;
352 double pheroAdd =
MAX2((maxSpeed - meanVehiclesSpeed) * 10 / maxSpeed, 0.0);
361 if (updatePheromone) {
362 std::ostringstream oss;
364 oss <<
" der " << derivative <<
" phero " << pheroAdd <<
" maxS " << maxSpeed <<
" meanS " << meanVehiclesSpeed;
370 double phero = beta * oldPhero + gamma * pheroAdd * updatePheromone;
373 std::ostringstream i_str;
374 i_str <<
"MSSwarmTrafficLightLogic::updatePheromoneLevels " << logString <<
" > 10. Value: " << phero;
379 pheroMap[laneId] = phero;
382 std::ostringstream i_str;
390 i_str <<
" op " << oldPhero <<
" ms " << meanVehiclesSpeed <<
" p " << pheroAdd * updatePheromone <<
391 " pe " << oldPhero - oldPhero * beta <<
" pd " << gamma * pheroAdd * updatePheromone <<
" np " <<
422 for (
int i = 0; i < (int)policies.size(); i++) {
426 std::ostringstream phero_str; phero_str <<
"Policy " << policies[i]->getName() <<
" sensitivity reset to " << policies[i]->getThetaSensitivity() <<
" due to evaporated input pheromone.";
WRITE_MESSAGE(
time2string(
MSNet::getInstance()->getCurrentTimeStep()) +
" MSSwarmTrafficLightLogic::updateSensitivities::" + phero_str.str());)
433 if (!
skipEta || currentPolicy->
getName().compare(
"Congestion") != 0) {
449 for (
int i = 0; i < (int)policies.size(); i++) {
451 double newSensitivity;
453 if (policy == currentPolicy) {
461 if (policy == currentPolicy) {
472 if (policy == currentPolicy) {
478 phero_str <<
" policy " << policy->
getName() <<
" newSensitivity " << newSensitivity <<
" ,pol.Sensitivity " << policy->
getThetaSensitivity() <<
" ,elapsedTime " << elapsedTime << lf.str() <<
" NEWERSensitivity= " << max(min(newSensitivity,
getThetaMax()),
getThetaMin()) <<
" ID " <<
getID() <<
" .";
480 if (policy == currentPolicy && eta > 0) {
482 }
else if (policy == currentPolicy && eta < 0) {
484 }
else if (eta > 0) {
486 }
else if (eta < 0) {
505 std::string laneId = iterator->first;
506 pheroIn += iterator->second;
508 std::ostringstream phero_str; phero_str <<
" lane " << iterator->first <<
" pheromoneIN " << iterator->second <<
" id " <<
getID() <<
" .";
WRITE_MESSAGE(
time2string(
MSNet::getInstance()->getCurrentTimeStep()) +
" MSSwarmTrafficLightLogic::getPheromoneForInputLanes::" + phero_str.str());)
524 std::ostringstream phero_str; phero_str <<
" lane " << iterator->first <<
" pheromoneOUT " << iterator->second <<
" id " <<
getID() <<
" .";
WRITE_MESSAGE(
time2string(
MSNet::getInstance()->getCurrentTimeStep()) +
" MSSwarmTrafficLightLogic::getPheromoneForOutputLanes::" + phero_str.str());)
525 pheroOut += iterator->second;
539 std::string laneId = iterator->first;
540 sum += pow(iterator->second - average_phero_in, 2);
545 ostringstream so_str; so_str <<
" dispersionIn " << result;
WRITE_MESSAGE(
"MSSwarmTrafficLightLogic::getDispersionForInputLanes::" + so_str.str());)
556 sum += pow(iterator->second - average_phero_out, 2);
561 ostringstream so_str; so_str <<
" dispersionOut " << result;
WRITE_MESSAGE(
"MSSwarmTrafficLightLogic::getDispersionForOutputLanes::" + so_str.str());)
568 double max_phero_val_current = 0;
569 double max_phero_val_old = 0;
570 double temp_avg_other_lanes = 0;
571 std::string laneId_max;
575 std::string laneId = iterator->first;
576 double lanePhero = iterator->second;
578 max_phero_val_current = lanePhero;
582 if (lanePhero > max_phero_val_current) {
583 max_phero_val_old = max_phero_val_current;
584 max_phero_val_current = lanePhero;
585 temp_avg_other_lanes = (temp_avg_other_lanes * (counter - 1) + max_phero_val_old) / counter;
587 temp_avg_other_lanes = (temp_avg_other_lanes * (counter - 1) + lanePhero) / counter;
593 double result = max_phero_val_current - temp_avg_other_lanes;
595 ostringstream so_str; so_str <<
" currentMaxPhero " << max_phero_val_current <<
" lane " << laneId_max <<
" avgOtherLanes " << temp_avg_other_lanes <<
" distance " << result;
WRITE_MESSAGE(
"MSSwarmTrafficLightLogic::getDistanceOfMaxPheroForInputLanes::" + so_str.str());)
603 double max_phero_val_current = 0;
604 double max_phero_val_old = 0;
605 double temp_avg_other_lanes = 0;
606 std::string laneId_max;
610 std::string laneId = iterator->first;
611 double lanePhero = iterator->second;
613 max_phero_val_current = lanePhero;
617 if (lanePhero > max_phero_val_current) {
618 max_phero_val_old = max_phero_val_current;
619 max_phero_val_current = lanePhero;
620 temp_avg_other_lanes = (temp_avg_other_lanes * (counter - 1) + max_phero_val_old) / counter;
622 temp_avg_other_lanes = (temp_avg_other_lanes * (counter - 1) + lanePhero) / counter;
628 double result = max_phero_val_current - temp_avg_other_lanes;
630 ostringstream so_str; so_str <<
" currentMaxPhero " << max_phero_val_current <<
" lane " << laneId_max <<
" avgOtherLanes " << temp_avg_other_lanes <<
" distance " << result;
WRITE_MESSAGE(
"MSSwarmTrafficLightLogic::getDistanceOfMaxPheroForOutputLanes::" + so_str.str());)
650 choosePolicy(pheroIn, pheroOut, distancePheroIn, distancePheroOut);
653 if (newPolicy != oldPolicy) {
656 if (oldPolicy->
getName().compare(
"Congestion") == 0) {
676 return 1 - (1 / ((double) factor));
682 MSLane* currentLane =
nullptr;
683 int count = 0, minIn = 0, minOut = 0, toSub, tmp;
684 bool inInit =
true, outInit =
true;
685 double eta, normalized, diff, phi, delta;
696 for (MSTrafficLightLogic::LaneVectorVector::const_iterator laneVector =
myLanes.begin();
697 laneVector !=
myLanes.end(); laneVector++) {
698 for (MSTrafficLightLogic::LaneVector::const_iterator lane = laneVector->begin(); lane != laneVector->end();
700 currentLane = (*lane);
708 std::ostringstream cars_str; cars_str <<
"Lane " << currentLane->
getID() <<
": vehicles entered - " << count;
WRITE_MESSAGE(
time2string(
MSNet::getInstance()->getCurrentTimeStep()) +
" MSSwarmTrafficLightLogic::calculateEta::" + cars_str.str());)
720 for (MSTrafficLightLogic::LinkVectorVector::const_iterator linkVector =
myLinks.begin();
721 linkVector !=
myLinks.end(); linkVector++) {
722 for (MSTrafficLightLogic::LinkVector::const_iterator link = linkVector->begin(); link != linkVector->end();
724 currentLane = (*link)->getLane();
732 std::ostringstream cars_str; cars_str <<
"Lane " << currentLane->
getID() <<
": vehicles gone out- " << count;
WRITE_MESSAGE(
time2string(
MSNet::getInstance()->getCurrentTimeStep()) +
" MSSwarmTrafficLightLogic::calculateEta::" + cars_str.str());)
742 toReset.push_back(currentLane->
getID());
746 }
else if (count <= minOut) {
760 std::string lane = (*laneId);
763 if (inInit && tmp != 0) {
767 if (tmp < minIn && tmp != 0) {
771 toReset.push_back(lane);
774 std::ostringstream cars_str; cars_str <<
"Lane " << lane <<
" passed: " << tmp;
WRITE_MESSAGE(
time2string(
MSNet::getInstance()->getCurrentTimeStep()) +
" MSSwarmTrafficLightLogic::calculateEta::" + cars_str.str());)
782 toSub = std::min(minIn, minOut);
785 while (!toReset.empty()) {
786 std::string laneId = toReset.back();
798 std::ostringstream final_str; final_str <<
"Total cars in lanes: " <<
carsIn <<
" Total cars out: " << carsOut <<
" Difference: " << diff <<
" Pure eta: " << normalized;
WRITE_MESSAGE(
time2string(
MSNet::getInstance()->getCurrentTimeStep()) +
" MSSwarmTrafficLightLogic::calculateEta::" + final_str.str());)
802 std::ostringstream eta_str; eta_str <<
"Min found:" << toSub <<
" MinIn:" << minIn <<
" MinOut:" << minOut;
WRITE_MESSAGE(
time2string(
MSNet::getInstance()->getCurrentTimeStep()) +
" MSSwarmTrafficLightLogic::calculateEta::" + eta_str.str());)
820 eta = (-normalized * (1 / phi));
858 eta = normalized * phi;
871 MSLane* currentLane =
nullptr;
872 int count = 0, minIn = 0, minOut = 0, toSub, tmp;
873 bool inInit =
true, outInit =
true;
874 double eta, ratio, phi, normalized, delta;
885 for (MSTrafficLightLogic::LaneVectorVector::const_iterator laneVector =
myLanes.begin();
886 laneVector !=
myLanes.end(); laneVector++) {
887 for (MSTrafficLightLogic::LaneVector::const_iterator lane = laneVector->begin(); lane != laneVector->end();
889 currentLane = (*lane);
897 std::ostringstream cars_str; cars_str <<
"Lane " << currentLane->
getID() <<
": vehicles entered - " << count;
WRITE_MESSAGE(
time2string(
MSNet::getInstance()->getCurrentTimeStep()) +
" MSSwarmTrafficLightLogic::calculateEta::" + cars_str.str());)
909 for (MSTrafficLightLogic::LinkVectorVector::const_iterator linkVector =
myLinks.begin();
910 linkVector !=
myLinks.end(); linkVector++) {
911 for (MSTrafficLightLogic::LinkVector::const_iterator link = linkVector->begin(); link != linkVector->end();
913 currentLane = (*link)->getLane();
921 std::ostringstream cars_str; cars_str <<
"Lane " << currentLane->
getID() <<
": vehicles gone out- " << count;
WRITE_MESSAGE(
time2string(
MSNet::getInstance()->getCurrentTimeStep()) +
" MSSwarmTrafficLightLogic::calculateEta::" + cars_str.str());)
931 toReset.push_back(currentLane->
getID());
935 }
else if (count <= minOut) {
950 std::string lane = (*laneId);
953 if (inInit && tmp != 0) {
957 if (tmp < minIn && tmp != 0) {
961 toReset.push_back(lane);
964 std::ostringstream cars_str; cars_str <<
"Lane " << lane <<
" passed: " << tmp;
WRITE_MESSAGE(
time2string(
MSNet::getInstance()->getCurrentTimeStep()) +
" MSSwarmTrafficLightLogic::calculateEta::" + cars_str.str());)
972 toSub = std::min(minIn, minOut);
975 while (!toReset.empty()) {
976 std::string laneId = toReset.back();
986 ratio = std::numeric_limits<double>::infinity();
987 normalized = std::numeric_limits<double>::infinity();
991 std::ostringstream final_str; final_str <<
"Total cars in lanes: " <<
carsIn <<
" Total cars out: " <<
carsOut <<
" Ratio: " << ratio <<
" Pure eta: " << normalized;
WRITE_MESSAGE(
time2string(
MSNet::getInstance()->getCurrentTimeStep()) +
" MSSwarmTrafficLightLogic::calculateEta::" + final_str.str());)
995 std::ostringstream eta_str; eta_str <<
"Min found:" << toSub <<
". MinIn:" << minIn <<
" MinOut:" << minOut;
WRITE_MESSAGE(
time2string(
MSNet::getInstance()->getCurrentTimeStep()) +
" MSSwarmTrafficLightLogic::calculateEta::" + eta_str.str());)
1014 eta = (-(normalized) * (1 / phi));
1050 eta = (normalized) * phi;
1058 std::ostringstream eta_str; eta_str <<
"Eta Normalized: " << eta <<
".";
WRITE_MESSAGE(
time2string(
MSNet::getInstance()->getCurrentTimeStep()) +
" MSSwarmTrafficLightLogic::calculateEta::" + eta_str.str());)
1065 MSLane* currentLane =
nullptr;
1068 for (MSTrafficLightLogic::LaneVectorVector::const_iterator laneVector =
myLanes.begin();
1069 laneVector !=
myLanes.end(); laneVector++) {
1071 for (MSTrafficLightLogic::LaneVector::const_iterator lane = laneVector->begin(); lane != laneVector->end();
1073 currentLane = (*lane);
1078 for (MSTrafficLightLogic::LinkVectorVector::const_iterator linkVector =
myLinks.begin();
1079 linkVector !=
myLinks.end(); linkVector++) {
1080 for (MSTrafficLightLogic::LinkVector::const_iterator link = linkVector->begin(); link != linkVector->end();
1082 currentLane = (*link)->getLane();
1089 double dispersion_out) {
1092 if (it.operator * ()->getName() ==
"Phase") {
1098 std::vector<double> thetaStimuli;
1099 double thetaSum = 0.0;
1101 for (
int i = 0; i < (int)
getPolicies().size(); i++) {
1102 double stimulus =
getPolicies()[i]->computeDesirability(phero_in, phero_out, dispersion_in, dispersion_out);
1103 double thetaStimulus = pow(stimulus, 2) / (pow(stimulus, 2) + pow(
getPolicies()[i]->getThetaSensitivity(), 2));
1105 thetaStimuli.push_back(thetaStimulus);
1106 thetaSum += thetaStimulus;
1110 ostringstream so_str; so_str <<
" policy " <<
getPolicies()[i]->getName() <<
" stimulus " << stimulus <<
" pow(stimulus,2) " << pow(stimulus, 2) <<
" pow(Threshold,2) " << pow(
getPolicies()[i]->getThetaSensitivity(), 2) <<
" thetaStimulus " << thetaStimulus <<
" thetaSum " << thetaSum <<
" TL " <<
getID();
WRITE_MESSAGE(
"MSSwarmTrafficLightLogic::choosePolicy::" + so_str.str());)
1119 double partialSum = 0;
1120 for (
int i = 0; i < (int)
getPolicies().size(); i++) {
1121 partialSum += thetaStimuli[i];
1125 ostringstream aao_str; aao_str <<
" policy " <<
getPolicies()[i]->getName() <<
" partialSum " << partialSum <<
" thetaStimuls " << thetaStimuli[i] <<
" r " << r <<
" TL " <<
getID();
WRITE_MESSAGE(
"MSSwarmTrafficLightLogic::choosePolicy::" + aao_str.str());)
1127 if (partialSum >= r) {
1147 std::string laneState =
"";
1151 laneState += state[*it];
std::map< std::string, double > MSLaneId_PheromoneMap
void initScaleFactorDispersionOut(int lanes_out)
virtual std::string getMessage()=0
MSSOTLSensors * getSensors()
const std::string & getState() const
Returns the state within this phase.
Builds detectors for microsim.
MSEdge & getEdge() const
Returns the lane's edge.
double getPheromoneForOutputLanes()
int getReinforcementMode()
Class for low-level platoon policy.
SUMOTime getMaxCongestionDuration()
static double rand(std::mt19937 *rng=0)
Returns a random real number in [0, 1)
std::string getPoliciesParam()
double getChangePlanProbability()
bool allowLine(MSLane *)
Check if a lane is allowed to be added to the maps pheromoneInputLanes and pheromoneOutputLanes Contr...
std::string time2string(SUMOTime t)
Class for low-level marching policy.
static MSNet * getInstance()
Returns the pointer to the unique instance of MSNet (singleton).
void init(NLDetectorBuilder &nb)
Initialises the tls.
virtual int decideNextPhase(SUMOTime elapsed, const MSPhaseDefinition *stage, int currentPhaseIndex, int phaseMaxCTS, bool thresholdPassed, bool pushButtonPressed, int vehicleCount)
std::ofstream swarmLogFile
void updatePheromoneLevels()
Update pheromone levels Pheromone on input lanes is costantly updated Pheromone follows a discrete-ti...
void updateSensitivities()
const std::string & getID() const
Returns the id.
SUMOTime congestion_steps
double getPheromoneForInputLanes()
LaneIdVector targetLanes
A copy of the target lanes of this phase.
const LinkVectorVector & getLinks() const
Returns the list of lists of all affected links.
int getPhaseIndexWithMaxCTS()
const LinkVector & getLinksAt(int i) const
Returns the list of links that are controlled by the signals at the given position.
virtual bool canRelease(SUMOTime elapsed, bool thresholdPassed, bool pushButtonPressed, const MSPhaseDefinition *stage, int vehicleCount)=0
A self-organizing high-level traffic light logic.
LaneVectorVector myLanes
The list of LaneVectors; each vector contains the incoming lanes that belong to the same link index...
double calculatePhi(int factor)
Method that should calculate the valor of phi a coefficient to amplify/attenuate eta based on a facto...
A class that stores and controls tls and switching of their programs.
bool mustChange
When true, indicates that the current policy MUST be changed. It's used to force the exit from the co...
MSSOTLPolicyDesirability * getDesirabilityAlgorithm()
MSSOTLPolicy * currentPolicy
std::vector< LinkVector > LinkVectorVector
Definition of a list that holds lists of links that do have the same attribute.
std::string getLaneLightState(const std::string &laneId)
double getDistanceOfMaxPheroForOutputLanes()
MSSOTLE2Sensors * getCountSensors()
Return the sensors that count the passage of vehicles in and out of the tl.
static double toDouble(const std::string &sData)
converts a string into the double value described by it by calling the char-type converter ...
std::pair< std::string, double > MSLaneId_Pheromone
double getDispersionForOutputLanes(double average_phero_out)
std::map< std::string, std::string > m_pheroLevelLog
int getPassedVeh(std::string laneId, bool out)
std::vector< MSSOTLPolicy * > & getPolicies()
Returns the vector of the low-level policies used by this high-level tll.
SVCPermissions getPermissions() const
Returns the vehicle class permissions for this lane.
double calculateEtaRatio()
bool skipEta
When true indicates that we can skip the evaluation of eta since we've a congestion policy that is la...
SUMOTime getCurrentTimeStep() const
Returns the current simulation step.
void decidePolicy()
Decide the current policy according to pheromone levels The decision reflects on currentPolicy value...
static MsgHandler * getMessageInstance()
Returns the instance to add normal messages to.
std::map< std::string, CircularBuffer< double > *> m_meanSpeedHistory
MSSwarmTrafficLightLogic(MSTLLogicControl &tlcontrol, const std::string &id, const std::string &programID, const Phases &phases, int step, SUMOTime delay, const std::map< std::string, std::string > ¶meters)
Constructor without sensors passed.
static int toInt(const std::string &sData)
converts a string into the integer value described by it by calling the char-type converter...
bool isCrossing() const
return whether this edge is a pedestrian crossing
bool gotTargetLane
When true indicates that we've already acquired the target lanes for this particular phase...
virtual void setThetaSensitivity(double val)
double getScaleFactorDispersionIn()
MSLaneId_PheromoneMap pheromoneOutputLanes
This pheromone is an indicator of congestion on output lanes. Its levels refer to the average speed o...
virtual int countVehicles(MSLane *lane)=0
~MSSwarmTrafficLightLogic()
std::vector< MSLink * > LinkVector
Definition of the list of links that are subjected to this tls.
MSSOTLPolicy * getCurrentPolicy()
Returns the low-level policy currently selected by this high-level tll.
std::vector< MSPhaseDefinition * > Phases
Definition of a list of phases, being the junction logic.
virtual double meanVehiclesSpeed(MSLane *lane)=0
This class determines the desirability algorithm of a MSSOTLPolicy when used in combination with a hi...
LinkVectorVector myLinks
The list of LinkVectors; each vector contains the links that belong to the same link index...
virtual double getMaxSpeed(std::string laneId)=0
virtual double getThetaSensitivity()
SUMOTime getCurrentPhaseElapsed()
void activate(MSSOTLPolicy *policy)
const MSPhaseDefinition & getCurrentPhaseDef() const
Returns the definition of the current phase.
void init(NLDetectorBuilder &nb)
Initialises the tls with sensors on incoming and outgoing lanes Sensors are built in the simulation a...
std::vector< MSSOTLPolicy * > policies
double getDistanceOfMaxPheroForInputLanes()
int getCurrentPhaseIndex() const
Returns the current index within the program.
Class for low-level phase policy.
double getForgettingCox()
void inform(std::string msg, bool addType=true)
adds a new error to the list
void choosePolicy(double phero_in, double phero_out, double dispersion_in, double dispersion_out)
const std::string getParameter(const std::string &key, const std::string &defaultValue="") const
Returns the value for a given key.
MSLaneId_PheromoneMap pheromoneInputLanes
This pheronome is an indicator of congestion on input lanes. Its levels refer to the average speed of...
Class for a low-level policy.
bool isWalkingArea() const
return whether this edge is walking area
SUMOTime lastThetaSensitivityUpdate
Class for low-level congestion policy.
bool m_useVehicleTypesWeights
const LaneIdVector & getTargetLaneSet() const
void subtractPassedVeh(std::string laneId, int passed)
void initScaleFactorDispersionIn(int lanes_in)
LaneCheckMap laneCheck
Map to check if a lane was already controlled during the elaboration of eta.
double getScaleFactorDispersionOut()
std::vector< std::string > LaneIdVector
#define WRITE_MESSAGE(msg)
double calculateEtaDiff()
Method that should calculate the valor of eta a coefficient to evaluate the current policy's work...
Representation of a lane in the micro simulation.
bool isPushButtonPressed()
std::map< std::string, std::vector< int > > m_laneIndexMap
void addPolicy(MSSOTLPolicy *policy)
double getDispersionForInputLanes(double average_phero_in)
void resetPheromone()
Resets pheromone levels.
int countVehicles(MSPhaseDefinition phase)
std::map< std::string, CircularBuffer< double > *> m_derivativeHistory