Line data Source code
1 : /****************************************************************************/
2 : // Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.dev/sumo
3 : // Copyright (C) 2013-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 MSSOTLPolicy.cpp
15 : /// @author Alessio Bonfietti
16 : /// @author Anna Chiara Bellini
17 : /// @author Federico Caselli
18 : /// @date Jun 2013
19 : ///
20 : // The class for low-level policy
21 : /****************************************************************************/
22 :
23 : #include <cmath>
24 : #include <typeinfo>
25 : #include "utils/common/RandHelper.h"
26 : #include "MSSOTLPolicy.h"
27 : //#define SWARM_DEBUG
28 :
29 :
30 : // ===========================================================================
31 : // method definitions
32 : // ===========================================================================
33 96 : void PushButtonLogic::init(std::string prefix, const Parameterised* parameterised) {
34 96 : m_prefix = prefix;
35 192 : m_pushButtonScaleFactor = StringUtils::toDouble(parameterised->getParameter("PUSH_BUTTON_SCALE_FACTOR", "1"));
36 480 : WRITE_MESSAGE(m_prefix + "::PushButtonLogic::init use " + parameterised->getParameter("USE_PUSH_BUTTON", "0") + " scale " + parameterised->getParameter("PUSH_BUTTON_SCALE_FACTOR", "1"));
37 96 : }
38 :
39 44346 : bool PushButtonLogic::pushButtonLogic(SUMOTime elapsed, bool pushButtonPressed, const MSPhaseDefinition* stage) {
40 : //pushbutton logic
41 44346 : if (pushButtonPressed && (double)elapsed >= (double)stage->duration * m_pushButtonScaleFactor) {
42 : //If the stage duration has been passed
43 : #ifdef SWARM_DEBUG
44 : std::ostringstream oss;
45 : oss << m_prefix << "::pushButtonLogic pushButtonPressed elapsed " << elapsed << " stage duration " << (stage->duration * m_pushButtonScaleFactor);
46 : WRITE_MESSAGE(oss.str());
47 : #endif
48 0 : return true;
49 : }
50 : return false;
51 : }
52 :
53 64 : void SigmoidLogic::init(std::string prefix, const Parameterised* parameterised) {
54 64 : m_prefix = prefix;
55 128 : m_useSigmoid = parameterised->getParameter("PLATOON_USE_SIGMOID", "0") != "0";
56 128 : m_k = StringUtils::toDouble(parameterised->getParameter("PLATOON_SIGMOID_K_VALUE", "1"));
57 : // DBG(
58 320 : WRITE_MESSAGE(m_prefix + "::SigmoidLogic::init use " + parameterised->getParameter("PLATOON_USE_SIGMOID", "0") + " k " + parameterised->getParameter("PLATOON_SIGMOID_K_VALUE", "1"));
59 : // for (int elapsed = 10; elapsed < 51; ++elapsed)
60 : // {
61 : // double sigmoidValue = 1.0 / (1.0 + exp(-m_k * (elapsed - 31)));
62 : // std::ostringstream oss;
63 : // oss << "elapsed " << elapsed << " value " << sigmoidValue;
64 : // WRITE_MESSAGE(oss.str())
65 : // }
66 : // )
67 64 : }
68 :
69 14596 : bool SigmoidLogic::sigmoidLogic(SUMOTime elapsed, const MSPhaseDefinition* stage, int vehicleCount) {
70 : //use the sigmoid logic
71 14596 : if (m_useSigmoid && vehicleCount == 0) {
72 0 : double sigmoidValue = 1.0 / (1.0 + exp(-m_k * STEPS2TIME(elapsed - stage->duration)));
73 0 : double rnd = RandHelper::rand();
74 : // DBG(
75 0 : std::ostringstream oss;
76 0 : oss << m_prefix << "::sigmoidLogic [k=" << m_k << " elapsed " << elapsed << " stage->duration " << stage->duration << " ] value "
77 : << sigmoidValue;
78 0 : oss << " rnd " << rnd << " retval " << (rnd < sigmoidValue ? "true" : "false");
79 0 : WRITE_MESSAGE(oss.str())
80 : // );
81 0 : return rnd < sigmoidValue;
82 0 : }
83 : return false;
84 : }
85 :
86 :
87 64 : MSSOTLPolicy::MSSOTLPolicy(std::string name,
88 64 : const Parameterised::Map& parameters) :
89 64 : Parameterised(parameters), myName(name) {
90 64 : theta_sensitivity = 0;
91 64 : }
92 :
93 0 : MSSOTLPolicy::MSSOTLPolicy(std::string name,
94 0 : MSSOTLPolicyDesirability* desirabilityAlgorithm) :
95 0 : Parameterised(), myName(name), myDesirabilityAlgorithm(
96 0 : desirabilityAlgorithm) {
97 0 : theta_sensitivity = 0;
98 0 : }
99 :
100 64 : MSSOTLPolicy::MSSOTLPolicy(std::string name,
101 : MSSOTLPolicyDesirability* desirabilityAlgorithm,
102 64 : const Parameterised::Map& parameters) :
103 128 : Parameterised(parameters), myName(name), myDesirabilityAlgorithm(
104 64 : desirabilityAlgorithm) {
105 128 : theta_sensitivity = StringUtils::toDouble(getParameter("THETA_INIT", "0.5"));
106 64 : }
107 :
108 64 : MSSOTLPolicy::~MSSOTLPolicy(void) {
109 64 : }
110 :
111 80 : double MSSOTLPolicy::computeDesirability(double vehInMeasure, double vehOutMeasure, double vehInDispersionMeasure, double vehOutDispersionMeasure) {
112 : #ifdef SWARM_DEBUG
113 : std::ostringstream str;
114 : str << "\nMSSOTLPolicy::computeStimulus\n" << getName();
115 : WRITE_MESSAGE(str.str());
116 : #endif
117 80 : return myDesirabilityAlgorithm->computeDesirability(vehInMeasure, vehOutMeasure, vehInDispersionMeasure, vehOutDispersionMeasure);
118 : }
119 :
120 0 : double MSSOTLPolicy::computeDesirability(double vehInMeasure, double vehOutMeasure) {
121 : #ifdef SWARM_DEBUG
122 : std::ostringstream str;
123 : str << "\nMSSOTLPolicy::computeStimulus\n" << getName();
124 : WRITE_MESSAGE(str.str());
125 : #endif
126 0 : return myDesirabilityAlgorithm->computeDesirability(vehInMeasure, vehOutMeasure, 0, 0);
127 : }
128 :
129 82826 : int MSSOTLPolicy::decideNextPhase(SUMOTime elapsed,
130 : const MSPhaseDefinition* stage, int currentPhaseIndex,
131 : int phaseMaxCTS, bool thresholdPassed, bool pushButtonPressed, int vehicleCount) {
132 :
133 : //If the junction was in a commit step
134 : //=> go to the target step that gives green to the set with the current highest CTS
135 : // and return computeReturnTime()
136 82826 : if (stage->isCommit()) {
137 : // decide which chain to activate. Gotta work on this
138 : return phaseMaxCTS;
139 : }
140 79677 : if (stage->isTransient()) {
141 : //If the junction was in a transient step
142 : //=> go to the next step and return computeReturnTime()
143 3149 : return currentPhaseIndex + 1;
144 : }
145 :
146 : if (stage->isDecisional()) {
147 : #ifdef SWARM_DEBUG
148 : std::ostringstream phero_str;
149 : phero_str << "getCurrentPhaseElapsed()=" << time2string(elapsed) << " isThresholdPassed()=" << thresholdPassed << " countVehicles()=" << vehicleCount;
150 : WRITE_MESSAGE("MSSOTLPolicy::decideNextPhase: " + phero_str.str());
151 : #endif
152 76528 : if (canRelease(elapsed, thresholdPassed, pushButtonPressed, stage, vehicleCount)) {
153 3149 : return currentPhaseIndex + 1;
154 : }
155 : }
156 :
157 : return currentPhaseIndex;
158 : }
159 :
160 : /*
161 : bool MSSOTLPolicy::canRelease(SUMOTime elapsed, bool thresholdPassed, const MSPhaseDefinition* stage, int vehicleCount) {
162 : if (getName().compare("request") == 0) {
163 : return elapsed > 3000 && thresholdPassed;
164 : } else if (getName().compare("phase") == 0) {
165 : return thresholdPassed && elapsed >= stage->minDuration;
166 : } else if (getName().compare("platoon") == 0) {
167 : return thresholdPassed && (vehicleCount == 0 || elapsed >= stage->maxDuration);
168 : } else if (getName().compare("marching") == 0) {
169 : return elapsed >= stage->duration;
170 : } else if (getName().compare("congestion") == 0) {
171 : return elapsed >= stage->minDuration;
172 : }
173 : return true; //
174 :
175 : }
176 : */
|