Line data Source code
1 : /****************************************************************************/
2 : // Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.dev/sumo
3 : // Copyright (C) 2010-2024 German Aerospace Center (DLR) and others.
4 : // This program and the accompanying materials are made available under the
5 : // terms of the Eclipse Public License 2.0 which is available at
6 : // https://www.eclipse.org/legal/epl-2.0/
7 : // This Source Code may also be made available under the following Secondary
8 : // Licenses when the conditions for such availability set forth in the Eclipse
9 : // Public License 2.0 are satisfied: GNU General Public License, version 2
10 : // or later which is available at
11 : // https://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html
12 : // SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-or-later
13 : /****************************************************************************/
14 : /// @file MSDeterministicHiLevelTrafficLightLogic.cpp
15 : /// @author Riccardo Belletti
16 : /// @date Mar 2014
17 : ///
18 : // The class for deterministic high level traffic light logic
19 : /****************************************************************************/
20 :
21 : #include "MSDeterministicHiLevelTrafficLightLogic.h"
22 : //#define SWARM_DEBUG
23 :
24 :
25 : // ===========================================================================
26 : // method definitions
27 : // ===========================================================================
28 0 : MSDeterministicHiLevelTrafficLightLogic::MSDeterministicHiLevelTrafficLightLogic(
29 : MSTLLogicControl& tlcontrol, const std::string& id,
30 : const std::string& programID, const Phases& phases, int step,
31 0 : SUMOTime delay, const Parameterised::Map& parameters) :
32 : MSSOTLHiLevelTrafficLightLogic(tlcontrol, id, programID, TrafficLightType::HILVL_DETERMINISTIC, phases, step,
33 0 : delay, parameters) {
34 :
35 0 : addPolicy(new MSSOTLPlatoonPolicy(new MSSOTLPolicy3DStimulus("PLATOON", parameters), parameters));
36 0 : addPolicy(new MSSOTLPhasePolicy(new MSSOTLPolicy3DStimulus("PHASE", parameters), parameters));
37 0 : addPolicy(new MSSOTLMarchingPolicy(new MSSOTLPolicy3DStimulus("MARCHING", parameters), parameters));
38 0 : addPolicy(new MSSOTLCongestionPolicy(new MSSOTLPolicy3DStimulus("CONGESTION", parameters), parameters));
39 :
40 0 : }
41 :
42 0 : MSDeterministicHiLevelTrafficLightLogic::~MSDeterministicHiLevelTrafficLightLogic() {
43 :
44 0 : }
45 :
46 0 : void MSDeterministicHiLevelTrafficLightLogic::init(NLDetectorBuilder& nb) {
47 0 : MSSOTLHiLevelTrafficLightLogic::init(nb);
48 : //Setting the startup policy
49 0 : choosePolicy(0, 0);
50 0 : WRITE_MESSAGE(
51 : "*** Intersection " + getID()
52 : + " will run using MSDeterministicHiLevelTrafficLightLogic ***");
53 :
54 : MSLane* currentLane = nullptr;
55 0 : for (MSTrafficLightLogic::LaneVectorVector::const_iterator laneVector =
56 0 : myLanes.begin(); laneVector != myLanes.end(); laneVector++) {
57 0 : for (MSTrafficLightLogic::LaneVector::const_iterator lane =
58 0 : laneVector->begin(); lane != laneVector->end(); lane++) {
59 0 : currentLane = (*lane);
60 0 : if (inputLanes.find(currentLane->getID()) == inputLanes.end()) {
61 : inputLanes.insert(currentLane->getID());
62 : #ifdef SWARM_DEBUG
63 : WRITE_MESSAGE("*** Intersection " + getID() + " inputLanes adding " + currentLane->getID());
64 : #endif
65 : }
66 : }
67 : }
68 :
69 0 : for (const LinkVector& oneLink : getLinks()) {
70 0 : for (int j = 0; j < (int)oneLink.size(); j++) {
71 0 : currentLane = oneLink[j]->getLane();
72 0 : if (outputLanes.find(currentLane->getID()) == outputLanes.end()) {
73 : outputLanes.insert(currentLane->getID());
74 : #ifdef SWARM_DEBUG
75 : WRITE_MESSAGE("*** Intersection " + getID() + " outputLanes adding " + currentLane->getID());
76 : #endif
77 : }
78 : }
79 : }
80 :
81 0 : }
82 :
83 0 : int MSDeterministicHiLevelTrafficLightLogic::decideNextPhase() {
84 : #ifdef SWARM_DEBUG
85 : MsgHandler::getMessageInstance()->inform("\n" + time2string(MSNet::getInstance()->getCurrentTimeStep()) + " MSDeterministicHiLevelTrafficLightLogic decideNextPhase()");
86 : std::ostringstream dnp;
87 : dnp << (MSNet::getInstance()->getCurrentTimeStep()) << " MSDeterministicHiLevelTrafficLightLogic::decideNextPhase:: " << "tlsid=" << getID() << " getCurrentPhaseDef().getState()=" << getCurrentPhaseDef().getState() << " is commit?" << getCurrentPhaseDef().isCommit();
88 : MsgHandler::getMessageInstance()->inform(dnp.str());
89 : #endif
90 :
91 : //Decide the current policy according to pheromone levels. this should be done only at the end of a chain, before selecting the new one
92 0 : if (getCurrentPhaseDef().isCommit()) {
93 0 : decidePolicy();
94 : }
95 :
96 : #ifdef SWARM_DEBUG
97 : std::ostringstream str;
98 : str << "tlsID=" << getID() << " currentPolicyname=" + getCurrentPolicy()->getName();
99 : WRITE_MESSAGE(str.str());
100 : #endif
101 :
102 : //Execute current policy. congestion "policy" must maintain the commit phase, and that must be an all-red one
103 0 : return myCurrentPolicy->decideNextPhase(getCurrentPhaseElapsed(),
104 0 : &getCurrentPhaseDef(), getCurrentPhaseIndex(),
105 0 : getPhaseIndexWithMaxCTS(), isThresholdPassed(), isPushButtonPressed(),
106 0 : countVehicles(getCurrentPhaseDef()));
107 : }
108 :
109 0 : double MSDeterministicHiLevelTrafficLightLogic::getMeanSpeedForInputLanes() {
110 0 : if (inputLanes.size() == 0) {
111 : return 0;
112 : }
113 : double vSpeedInTot = 0;
114 0 : for (MSLaneID_set::iterator laneIterator = inputLanes.begin();
115 0 : laneIterator != inputLanes.end(); laneIterator++) {
116 : std::string laneId = *laneIterator;
117 0 : double maxSpeed = getSensors()->meanVehiclesSpeed(laneId);
118 0 : if (maxSpeed > -1) {
119 0 : vSpeedInTot += (13.89 - maxSpeed) * 10. / 13.89;
120 : }
121 : #ifdef SWARM_DEBUG
122 : std::ostringstream i_str;
123 : i_str << " meanVehiclesSpeed " << maxSpeed << " inputLane " << laneId << " ID " << getID() << " .";
124 : WRITE_MESSAGE(time2string(MSNet::getInstance()->getCurrentTimeStep()) + " MSDeterministicHiLevelTrafficLightLogic::getMeanSpeedForInputLanes:: in" + i_str.str());
125 : #endif
126 : }
127 0 : return vSpeedInTot / (double)inputLanes.size();
128 : }
129 :
130 0 : double MSDeterministicHiLevelTrafficLightLogic::getMeanSpeedForOutputLanes() {
131 0 : if (outputLanes.size() == 0) {
132 : return 0;
133 : }
134 : double vSpeedOutTot = 0;
135 0 : for (MSLaneID_set::iterator laneIterator = outputLanes.begin();
136 0 : laneIterator != outputLanes.end(); laneIterator++) {
137 : std::string laneId = *laneIterator;
138 0 : double maxSpeed = getSensors()->meanVehiclesSpeed(laneId);
139 0 : if (maxSpeed > -1) {
140 0 : vSpeedOutTot += (13.89 - maxSpeed) * 10. / 13.89;
141 : }
142 : #ifdef SWARM_DEBUG
143 : std::ostringstream i_str;
144 : i_str << " meanVehiclesSpeed " << maxSpeed << " outputLane " << laneId << " ID " << getID() << " .";
145 : WRITE_MESSAGE(time2string(MSNet::getInstance()->getCurrentTimeStep()) + " MSDeterministicHiLevelTrafficLightLogic::getMeanSpeedForOutputLanes:: out" + i_str.str());
146 : #endif
147 : }
148 0 : return vSpeedOutTot / (double)outputLanes.size();
149 : }
150 :
151 0 : void MSDeterministicHiLevelTrafficLightLogic::decidePolicy() {
152 : // Decide if it is the case to check for another plan
153 0 : double mean_vSpeed_in = getMeanSpeedForInputLanes();
154 0 : double mean_vSpeed_out = getMeanSpeedForOutputLanes();
155 : #ifdef SWARM_DEBUG
156 : MSSOTLPolicy* oldPolicy = getCurrentPolicy();
157 : #endif
158 0 : choosePolicy(mean_vSpeed_in, mean_vSpeed_out);
159 :
160 : #ifdef SWARM_DEBUG
161 : MSSOTLPolicy* newPolicy = getCurrentPolicy();
162 : if (newPolicy != oldPolicy) {
163 : SUMOTime step = MSNet::getInstance()->getCurrentTimeStep();
164 : std::ostringstream phero_str;
165 : phero_str << " (mean_vSpeed_in= " << mean_vSpeed_in << " ,mean_vSpeed_out= " << mean_vSpeed_out << " )";
166 : WRITE_MESSAGE("TL " + getID() + " time=" + time2string(step) + " Policy: " + newPolicy->getName() + phero_str.str() + " OldPolicy: " + oldPolicy->getName() + " id " + getID() + " .");
167 : } else { //debug purpose only
168 : std::ostringstream phero_str;
169 : phero_str << " (mean_vSpeed_in= " << mean_vSpeed_in << " ,mean_vSpeed_out= " << mean_vSpeed_out << " )";
170 : SUMOTime step = MSNet::getInstance()->getCurrentTimeStep();
171 : WRITE_MESSAGE("TL " + getID() + " time=" + time2string(step) + " Policy: Nochanges" + phero_str.str() + " OldPolicy: " + oldPolicy->getName() + " id " + getID() + " .");
172 : }
173 : #endif
174 0 : }
175 :
176 0 : void MSDeterministicHiLevelTrafficLightLogic::choosePolicy(
177 : double mean_vSpeed_in, double mean_vSpeed_out) {
178 :
179 : int index_maxStimulus = 0;
180 : double maxStimulus = -1;
181 : // Compute simulus for each policy
182 0 : for (int i = 0; i < (int)myPolicies.size(); i++) {
183 0 : double stimulus = myPolicies[i]->computeDesirability(mean_vSpeed_in,
184 : mean_vSpeed_out);
185 0 : if (stimulus > maxStimulus) {
186 : maxStimulus = stimulus;
187 : index_maxStimulus = i;
188 : }
189 : #ifdef SWARM_DEBUG
190 : std::ostringstream so_str;
191 : so_str << " policy " << getPolicies()[i]->getName() << " stimulus " << stimulus;
192 : WRITE_MESSAGE("MSDeterministicHiLevelTrafficLightLogic::choosePolicy::" + so_str.str());
193 : #endif
194 : }
195 0 : activate(myPolicies[index_maxStimulus]);
196 :
197 0 : }
198 :
199 0 : bool MSDeterministicHiLevelTrafficLightLogic::canRelease() {
200 : #ifdef SWARM_DEBUG
201 : std::ostringstream phero_str;
202 : phero_str << "getCurrentPhaseElapsed()=" << time2string(getCurrentPhaseElapsed()) << " isThresholdPassed()=" << isThresholdPassed() << " currentPhase=" << (&getCurrentPhaseDef())->getState() << " countVehicles()=" << countVehicles(getCurrentPhaseDef());
203 : WRITE_MESSAGE("\nMSDeterministicHiLevelTrafficLightLogic::canRelease(): " + phero_str.str());
204 : #endif
205 0 : return myCurrentPolicy->canRelease(getCurrentPhaseElapsed(),
206 0 : isThresholdPassed(), isPushButtonPressed(), &getCurrentPhaseDef(),
207 0 : countVehicles(getCurrentPhaseDef()));
208 : }
|