41 #ifdef CHECK_MEMORY_LEAKS 43 #endif // CHECK_MEMORY_LEAKS 51 #define LOOK_FORWARD_SPEED_DIVIDER (SUMOReal)14. 57 #define LOOK_FORWARD_RIGHT (SUMOReal)10. 58 #define LOOK_FORWARD_LEFT (SUMOReal)20. 60 #define JAM_FACTOR (SUMOReal)1. 63 #define LCA_RIGHT_IMPATIENCE (SUMOReal)-1. 64 #define CUT_IN_LEFT_SPEED_THRESHOLD (SUMOReal)27. 65 #define MAX_ONRAMP_LENGTH (SUMOReal)200. 67 #define LOOK_AHEAD_MIN_SPEED (SUMOReal)0.0 68 #define LOOK_AHEAD_SPEED_MEMORY (SUMOReal)0.9 69 #define LOOK_AHEAD_SPEED_DECREMENT 6. 71 #define HELP_DECEL_FACTOR (SUMOReal)1.0 73 #define HELP_OVERTAKE (SUMOReal)(10.0 / 3.6) 74 #define MIN_FALLBEHIND (SUMOReal)(14.0 / 3.6) 76 #define KEEP_RIGHT_HEADWAY (SUMOReal)2.0 78 #define URGENCY (SUMOReal)2.0 80 #define ROUNDABOUT_DIST_BONUS (SUMOReal)100.0 82 #define CHANGE_PROB_THRESHOLD_RIGHT (SUMOReal)2.0 83 #define CHANGE_PROB_THRESHOLD_LEFT (SUMOReal)0.2 84 #define KEEP_RIGHT_TIME (SUMOReal)5.0 // the number of seconds after which a vehicle should move to the right lane 85 #define KEEP_RIGHT_ACCEPTANCE (SUMOReal)7.0 // calibration factor for determining the desire to keep right 87 #define RELGAIN_NORMALIZATION_MIN_SPEED (SUMOReal)10.0 89 #define TURN_LANE_DIST (SUMOReal)200.0 // the distance at which a lane leading elsewhere is considered to be a turn-lane that must be avoided 96 #define DEBUG_COND false 101 return v == 0 ?
"NULL" : v->
getID();
110 mySpeedGainProbability(0),
111 myKeepRightProbability(0),
112 myLeadingBlockerLength(0),
127 const std::pair<MSVehicle*, SUMOReal>& leader,
128 const std::pair<MSVehicle*, SUMOReal>& neighLead,
129 const std::pair<MSVehicle*, SUMOReal>& neighFollow,
131 const std::vector<MSVehicle::LaneQ>& preb,
143 <<
" considerChangeTo=" << (laneOffset == -1 ?
"right" :
"left")
147 const int result =
_wantsChange(laneOffset, msgPass, blocked, leader, neighLead, neighFollow, neighLane, preb, lastBlocked, firstBlocked);
152 <<
" wantsChangeTo=" << (laneOffset == -1 ?
"right" :
"left")
159 << ((result &
LCA_TRACI) ?
" (traci)" :
"")
176 const std::string patched = (wanted != newSpeed ?
" patched=" +
toString(newSpeed) :
"");
182 <<
" wanted=" << wanted
213 std::cout << time <<
" veh=" <<
myVehicle.
getID() <<
" slowing down for leading blocker, safe=" << safe << (safe +
NUMERICAL_EPS < min ?
" (not enough)" :
"") <<
"\n";
215 return MAX2(min, safe);
222 for (std::vector<SUMOReal>::const_iterator i =
myVSafes.begin(); i !=
myVSafes.end(); ++i) {
224 if (v >= min && v <= max) {
225 nVSafe =
MIN2(v, nVSafe);
228 std::cout << time <<
" veh=" <<
myVehicle.
getID() <<
" got nVSafe=" << nVSafe <<
"\n";
233 std::cout << time <<
" veh=" <<
myVehicle.
getID() <<
" ignoring low nVSafe=" << v <<
" min=" << min <<
"\n";
237 std::cout << time <<
" veh=" <<
myVehicle.
getID() <<
" ignoring high nVSafe=" << v <<
" max=" << max <<
"\n";
245 std::cout << time <<
" veh=" <<
myVehicle.
getID() <<
" got vSafe\n";
256 std::cout << time <<
" veh=" <<
myVehicle.
getID() <<
" LCA_WANTS_LANECHANGE (strat, no vSafe)\n";
258 return (max + wanted) / (
SUMOReal) 2.0;
263 std::cout << time <<
" veh=" <<
myVehicle.
getID() <<
" LCA_BLOCKED_BY_LEADER (coop)\n";
265 return (min + wanted) / (
SUMOReal) 2.0;
269 std::cout << time <<
" veh=" <<
myVehicle.
getID() <<
" LCA_BLOCKED_BY_FOLLOWER (coop)\n";
271 return (max + wanted) / (
SUMOReal) 2.0;
313 std::cout << time <<
" veh=" <<
myVehicle.
getID() <<
" LCA_AMBLOCKINGLEADER\n";
315 return (max + wanted) / (
SUMOReal) 2.0;
320 std::cout << time <<
" veh=" <<
myVehicle.
getID() <<
" LCA_AMBLOCKINGFOLLOWER_DONTBRAKE\n";
341 if (pinfo->first >= 0) {
349 <<
" informedBy=" << sender->
getID()
350 <<
" info=" << pinfo->second
351 <<
" vSafe=" << pinfo->first
363 const std::pair<MSVehicle*, SUMOReal>& neighLead,
367 for (std::vector<SUMOReal>::const_iterator i =
myVSafes.begin(); i !=
myVSafes.end(); ++i) {
370 plannedSpeed =
MIN2(plannedSpeed, v);
374 std::cout <<
" informLeader speed=" <<
myVehicle.
getSpeed() <<
" planned=" << plannedSpeed <<
"\n";
378 assert(neighLead.first != 0);
380 if (
gDebugFlag2) std::cout <<
" blocked by leader nv=" << nv->
getID() <<
" nvSpeed=" << nv->
getSpeed() <<
" needGap=" 384 const SUMOReal overtakeDist = (neighLead.second
396 || dv * remainingSeconds < overtakeDist) {
410 <<
" cannot overtake leader nv=" << nv->
getID()
412 <<
" remainingSeconds=" << remainingSeconds
413 <<
" targetSpeed=" << targetSpeed
414 <<
" nextSpeed=" << nextSpeed
423 <<
" cannot overtake fast leader nv=" << nv->
getID()
425 <<
" remainingSeconds=" << remainingSeconds
426 <<
" targetSpeed=" << targetSpeed
435 <<
" wants to overtake leader nv=" << nv->
getID()
437 <<
" remainingSeconds=" << remainingSeconds
438 <<
" currentGap=" << neighLead.second
440 <<
" overtakeDist=" << overtakeDist
447 }
else if (neighLead.first != 0) {
456 std::cout <<
" not blocked by leader nv=" << nv->
getID()
458 <<
" gap=" << neighLead.second
459 <<
" nextGap=" << neighLead.second - dv
461 <<
" targetSpeed=" << targetSpeed
464 return MIN2(targetSpeed, plannedSpeed);
476 const std::pair<MSVehicle*, SUMOReal>& neighFollow,
480 assert(neighFollow.first != 0);
482 if (
gDebugFlag2) std::cout <<
" blocked by follower nv=" << nv->
getID() <<
" nvSpeed=" << nv->
getSpeed() <<
" needGap=" 488 if ((neededGap - neighFollow.second) / remainingSeconds < (plannedSpeed - nv->
getSpeed())) {
490 std::cout <<
" wants to cut in before nv=" << nv->
getID() <<
" without any help neededGap=" << neededGap <<
"\n";
509 const SUMOReal dv = plannedSpeed - neighNewSpeed1s;
511 const SUMOReal decelGap = neighFollow.second + dv;
516 <<
" egoNV=" << plannedSpeed
517 <<
" nvNewSpeed=" << neighNewSpeed
518 <<
" nvNewSpeed1s=" << neighNewSpeed1s
519 <<
" deltaGap=" << dv
520 <<
" decelGap=" << decelGap
521 <<
" secGap=" << secureGap
524 if (decelGap > 0 && decelGap >= secureGap) {
534 assert(vsafe <= vsafe1);
537 std::cout <<
" wants to cut in before nv=" << nv->
getID()
538 <<
" vsafe1=" << vsafe1
539 <<
" vsafe=" << vsafe
543 }
else if (dv > 0 && dv * remainingSeconds > (secureGap - decelGap +
POSITION_EPS)) {
547 std::cout <<
" wants to cut in before nv=" << nv->
getID() <<
" (eventually)\n";
553 std::cout <<
" wants to cut in before nv=" << nv->
getID() <<
" (nv cannot overtake right)\n";
567 std::cout <<
" wants right follower to slow down a bit\n";
571 std::cout <<
" wants to cut in before right follower nv=" << nv->
getID() <<
" (eventually)\n";
579 const SUMOReal overtakeDist = (neighFollow.second
585 const SUMOReal needDV = overtakeDist / remainingSeconds;
592 <<
" wants to be overtaken by=" << nv->
getID()
593 <<
" overtakeDist=" << overtakeDist
595 <<
" vhelp=" << vhelp
596 <<
" needDV=" << needDV
601 }
else if (neighFollow.first != 0) {
610 std::cout <<
" wants to cut in before non-blocking follower nv=" << nv->
getID() <<
"\n";
653 const std::pair<MSVehicle*, SUMOReal>& leader,
654 const std::pair<MSVehicle*, SUMOReal>& neighLead,
655 const std::pair<MSVehicle*, SUMOReal>& neighFollow,
657 const std::vector<MSVehicle::LaneQ>& preb,
660 assert(laneOffset == 1 || laneOffset == -1);
664 int bestLaneOffset = 0;
673 for (
int p = 0; p < (int) preb.size(); ++p) {
674 if (preb[p].lane == prebLane && p + laneOffset >= 0) {
675 assert(p + laneOffset < (
int)preb.size());
677 neigh = preb[p + laneOffset];
678 currentDist = curr.
length;
680 bestLaneOffset = curr.bestLaneOffset;
682 if (bestLaneOffset == 0 && preb[p + laneOffset].bestLaneOffset == 0) {
686 <<
" bestLaneOffsetOld=" << bestLaneOffset
687 <<
" bestLaneOffsetNew=" << laneOffset
690 bestLaneOffset = laneOffset;
692 best = preb[p + bestLaneOffset];
698 const bool right = (laneOffset == -1);
703 const bool changeToBest = (right && bestLaneOffset < 0) || (!right && bestLaneOffset > 0);
727 <<
" firstBlocked=" <<
tryID(*firstBlocked)
728 <<
" lastBlocked=" <<
tryID(*lastBlocked)
729 <<
" leader=" <<
tryID(leader.first)
730 <<
" leaderGap=" << leader.second
731 <<
" neighLead=" <<
tryID(neighLead.first)
732 <<
" neighLeadGap=" << neighLead.second
733 <<
" neighFollow=" <<
tryID(neighFollow.first)
734 <<
" neighFollowGap=" << neighFollow.second
740 if (lastBlocked != firstBlocked) {
773 if (bestLaneOffset == 0 && leader.first != 0 && leader.first->isStopped()) {
776 + leader.first->getVehicleType().getLengthWithGap());
787 int roundaboutEdgesAhead = 0;
789 if ((*it) != 0 && (*it)->getEdge().isRoundabout()) {
790 roundaboutEdgesAhead += 1;
791 }
else if (roundaboutEdgesAhead > 0) {
796 int roundaboutEdgesAheadNeigh = 0;
798 if ((*it) != 0 && (*it)->getEdge().isRoundabout()) {
799 roundaboutEdgesAheadNeigh += 1;
800 }
else if (roundaboutEdgesAheadNeigh > 0) {
805 if (roundaboutEdgesAhead > 1) {
809 if (roundaboutEdgesAhead > 0) {
811 std::cout <<
" roundaboutEdgesAhead=" << roundaboutEdgesAhead <<
" roundaboutEdgesAheadNeigh=" << roundaboutEdgesAheadNeigh <<
"\n";
817 const SUMOReal maxJam =
MAX2(preb[currIdx + laneOffset].occupation, preb[currIdx].occupation);
824 <<
" laDist=" << laDist
825 <<
" currentDist=" << currentDist
826 <<
" usableDist=" << usableDist
827 <<
" bestLaneOffset=" << bestLaneOffset
828 <<
" best.length=" << best.
length 829 <<
" maxJam=" << maxJam
830 <<
" neighLeftPlace=" << neighLeftPlace
853 <<
" avoid overtaking on the right nv=" << nv->
getID()
856 <<
" plannedSpeed=" <<
myVSafes.back()
870 std::cout <<
" veh=" <<
myVehicle.
getID() <<
" could not change back and forth in time (1) neighLeftPlace=" << neighLeftPlace <<
"\n";
873 }
else if (bestLaneOffset == 0 && (neighLeftPlace * 2. < laDist)) {
879 std::cout <<
" veh=" <<
myVehicle.
getID() <<
" could not change back and forth in time (2) neighLeftPlace=" << neighLeftPlace <<
"\n";
882 }
else if (bestLaneOffset == 0
883 && (leader.first == 0 || !leader.first->isStopped())
885 && roundaboutEdgesAhead == 0
891 std::cout <<
" veh=" <<
myVehicle.
getID() <<
" does not want to leave the bestLane (neighDist=" << neighDist <<
")\n";
901 if ((ret & lcaCounter) != 0) {
906 std::cout <<
" retAfterInfluence=" << ret <<
"\n";
916 if (changeToBest &&
abs(bestLaneOffset) > 1) {
919 std::cout <<
" reserving space for unseen blockers\n";
927 if (*firstBlocked != neighLead.first) {
934 const SUMOReal plannedSpeed =
informLeader(msgPass, blocked, myLca, neighLead, remainingSeconds);
935 if (plannedSpeed >= 0) {
937 informFollower(msgPass, blocked, myLca, neighFollow, remainingSeconds, plannedSpeed);
944 <<
" remainingSeconds=" << remainingSeconds
945 <<
" plannedSpeed=" << plannedSpeed
952 if (roundaboutEdgesAhead > 1) {
970 std::cout <<
" veh=" <<
myVehicle.
getID() <<
" does not want to get stranded on the on-ramp of a highway\n";
995 <<
" wantsChangeToHelp=" << (right ?
"right" :
"left")
997 << (((
myOwnState & myLcaCounter) != 0) ?
" (counter)" :
"")
1022 if (neighLead.first == 0) {
1027 &
myVehicle,
myVehicle.
getSpeed(), neighLead.second, neighLead.first->getSpeed(), neighLead.first->getCarFollowModel().getMaxDecel()));
1029 if (leader.first == 0) {
1038 <<
" currentDist=" << currentDist
1039 <<
" neighDist=" << neighDist
1044 thisLaneVSafe =
MIN2(thisLaneVSafe, vMax);
1045 neighLaneVSafe =
MIN2(neighLaneVSafe, vMax);
1046 const SUMOReal relativeGain = (neighLaneVSafe - thisLaneVSafe) /
MAX2(neighLaneVSafe,
1051 if (thisLaneVSafe - 5 / 3.6 > neighLaneVSafe) {
1062 if (mySpeedGainProbability < 0 || relativeGain > 0) {
1071 SUMOReal fullSpeedDrivingSeconds =
MIN2(acceptanceTime, fullSpeedGap / vMax);
1072 if (neighLead.first != 0 && neighLead.first->getSpeed() < vMax) {
1075 vMax, neighLead.first->getSpeed(), neighLead.first->getCarFollowModel().getMaxDecel())));
1076 fullSpeedDrivingSeconds =
MIN2(fullSpeedDrivingSeconds, fullSpeedGap / (vMax - neighLead.first->getSpeed()));
1087 <<
" neighDist=" << neighDist
1089 <<
" leaderSpeed=" << (neighLead.first == 0 ? -1 : neighLead.first->getSpeed())
1091 myVehicle.
getSpeed(), neighLead.first->getSpeed(), neighLead.first->getCarFollowModel().getMaxDecel()))
1092 <<
" acceptanceTime=" << acceptanceTime
1093 <<
" fullSpeedGap=" << fullSpeedGap
1094 <<
" fullSpeedDrivingSeconds=" << fullSpeedDrivingSeconds
1095 <<
" dProb=" << deltaProb
1112 <<
" thisLaneVSafe=" << thisLaneVSafe
1113 <<
" neighLaneVSafe=" << neighLaneVSafe
1114 <<
" relativeGain=" << relativeGain
1115 <<
" blocked=" << blocked
1128 if (thisLaneVSafe > neighLaneVSafe) {
1152 <<
" thisLaneVSafe=" << thisLaneVSafe
1153 <<
" neighLaneVSafe=" << neighLaneVSafe
1154 <<
" relativeGain=" << relativeGain
1155 <<
" blocked=" << blocked
1167 && (right ? mySpeedGainProbability < 0 : mySpeedGainProbability > 0)) {
1179 <<
" thisLaneVSafe=" << thisLaneVSafe
1180 <<
" neighLaneVSafe=" << neighLaneVSafe
1190 if ((*blocked) != 0) {
1195 <<
" blocked=" <<
tryID(*blocked)
1214 (*blocked)->getCarFollowModel().getMaxDecel()));
1228 <<
" saveBlockerLength blocker=" <<
tryID(blocker)
1242 <<
" blocker=" <<
tryID(blocker)
1252 <<
" blocker=" <<
tryID(blocker)
1254 <<
" potential=" << potential
void * inform(void *info, MSVehicle *sender)
#define LOOK_AHEAD_MIN_SPEED
int _wantsChange(int laneOffset, MSAbstractLaneChangeModel::MSLCMessager &msgPass, int blocked, const std::pair< MSVehicle *, SUMOReal > &leader, const std::pair< MSVehicle *, SUMOReal > &neighLead, const std::pair< MSVehicle *, SUMOReal > &neighFollow, const MSLane &neighLane, const std::vector< MSVehicle::LaneQ > &preb, MSVehicle **lastBlocked, MSVehicle **firstBlocked)
helper function for doing the actual work
MSEdge & getEdge() const
Returns the lane's edge.
#define CHANGE_PROB_THRESHOLD_LEFT
Representation of a vehicle in the micro simulation.
SUMOReal getMaxSpeed() const
Get vehicle's maximum speed [m/s].
int slowDownForBlocked(MSVehicle **blocked, int state)
compute useful slowdowns for blocked vehicles
const MSCFModel & getCarFollowModel() const
Returns the vehicle's car following model definition.
bool currentDistAllows(SUMOReal dist, int laneOffset, SUMOReal lookForwardDist)
const std::vector< MSLane * > & getLanes() const
Returns this edge's lanes.
The action is done to help someone else.
SUMOReal getLengthWithGap() const
Get vehicle's length including the minimum gap [m].
int bestLaneOffset
The (signed) number of lanes to be crossed to get to the lane which allows to continue the drive...
virtual SUMOReal followSpeed(const MSVehicle *const veh, SUMOReal speed, SUMOReal gap2pred, SUMOReal predSpeed, SUMOReal predMaxDecel) const =0
Computes the vehicle's follow speed (no dawdling)
SUMOReal myLeadingBlockerLength
The car-following model abstraction.
void * informNeighFollower(void *info, MSVehicle *sender)
Informs the follower on the desired lane.
SUMOReal getLength() const
Get vehicle's length [m].
int wantsChange(int laneOffset, MSAbstractLaneChangeModel::MSLCMessager &msgPass, int blocked, const std::pair< MSVehicle *, SUMOReal > &leader, const std::pair< MSVehicle *, SUMOReal > &neighLead, const std::pair< MSVehicle *, SUMOReal > &neighFollow, const MSLane &neighLane, const std::vector< MSVehicle::LaneQ > &preb, MSVehicle **lastBlocked, MSVehicle **firstBlocked)
Called to examine whether the vehicle wants to change using the given laneOffset. This method gets th...
static MSNet * getInstance()
Returns the pointer to the unique instance of MSNet (singleton).
MSLCM_JE2013(MSVehicle &v)
std::vector< SUMOReal > myVSafes
SUMOReal getSecureGap(const SUMOReal speed, const SUMOReal leaderSpeed, const SUMOReal leaderMaxDecel) const
Returns the minimum gap to reserve if the leader is braking at maximum.
void initLastLaneChangeOffset(int dir)
SUMOReal getPositionOnLane() const
Get the vehicle's position along the lane.
The action is due to a TraCI request.
SUMOTime getCurrentTimeStep() const
Returns the current simulation step.
SUMOReal length
The overall length which may be driven when using this lane without a lane change.
The action is urgent (to be defined by lc-model)
MSAbstractLaneChangeModel & getLaneChangeModel()
void informFollower(MSAbstractLaneChangeModel::MSLCMessager &msgPass, int blocked, int dir, const std::pair< MSVehicle *, SUMOReal > &neighFollow, SUMOReal remainingSeconds, SUMOReal plannedSpeed)
decide whether we will try cut in before the follower or allow to be overtaken
#define LCA_RIGHT_IMPATIENCE
std::pair< SUMOReal, int > Info
information regarding save velocity (unused) and state flags of the ego vehicle
static bool myAllowOvertakingRight
whether overtaking on the right is permitted
A class responsible for exchanging messages between cars involved in lane-change interaction.
const std::string & getID() const
Returns the id.
bool cancelRequest(int state)
whether the influencer cancels the given request
SUMOReal brakeGap(const SUMOReal speed) const
Returns the distance the vehicle needs to halt including driver's reaction time.
#define CUT_IN_LEFT_SPEED_THRESHOLD
SUMOReal mySpeedGainProbability
a value for tracking the probability that a change to the offset with the same sign is beneficial ...
SUMOReal getMinGap() const
Get the free space in front of vehicles of this class.
#define RELGAIN_NORMALIZATION_MIN_SPEED
#define LOOK_FORWARD_RIGHT
bool amBlockingFollowerPlusNB()
SUMOReal informLeader(MSAbstractLaneChangeModel::MSLCMessager &msgPass, int blocked, int dir, const std::pair< MSVehicle *, SUMOReal > &neighLead, SUMOReal remainingSeconds)
SUMOReal _patchSpeed(const SUMOReal min, const SUMOReal wanted, const SUMOReal max, const MSCFModel &cfModel)
void saveBlockerLength(MSVehicle *blocker, int lcaCounter)
save space for vehicles which need to counter-lane-change
#define MAX_ONRAMP_LENGTH
virtual SUMOReal stopSpeed(const MSVehicle *const veh, const SUMOReal speed, SUMOReal gap2pred) const =0
Computes the vehicle's safe speed for approaching a non-moving obstacle (no dawdling) ...
SUMOReal getSpeedLimit() const
Returns the lane's maximum allowed speed.
std::string tryID(const MSVehicle *v)
A structure representing the best lanes for continuing the route.
SUMOReal getMaxDecel() const
Get the vehicle type's maximum deceleration [m/s^2].
SUMOReal changeRequestRemainingSeconds(const SUMOTime currentTime) const
Return the remaining number of seconds of the current laneTimeLine assuming one exists.
int myOwnState
The current state of the vehicle.
std::string toString(const T &t, std::streamsize accuracy=OUTPUT_ACCURACY)
virtual void saveBlockerLength(SUMOReal length)
reserve space at the end of the lane to avoid dead locks
#define HELP_DECEL_FACTOR
MSVehicle & myVehicle
The vehicle this lane-changer belongs to.
void * informNeighLeader(void *info, MSVehicle *sender)
Informs the leader on the desired lane.
The action is needed to follow the route (navigational lc)
EdgeBasicFunction getPurpose() const
Returns the edge type (EdgeBasicFunction)
Influencer & getInfluencer()
Returns the velocity/lane influencer.
SUMOReal myKeepRightProbability
#define LOOK_AHEAD_SPEED_MEMORY
#define ROUNDABOUT_DIST_BONUS
SUMOReal occupation
The overall vehicle sum on consecutive lanes which can be passed without a lane change.
#define CHANGE_PROB_THRESHOLD_RIGHT
std::vector< MSLane * > bestContinuations
Consecutive lane that can be followed without a lane change (contribute to length and occupation) ...
SUMOReal myLookAheadSpeed
The action is due to the default of keeping right "Rechtsfahrgebot".
const MSVehicleType & getVehicleType() const
Returns the vehicle's type definition.
const SUMOReal SUMO_const_haltingSpeed
the speed threshold at which vehicles are considered as halting
Needs to stay on the current lane.
SUMOReal getSpeed() const
Returns the vehicle's current speed.
SUMOReal getWaitingSeconds() const
Returns the number of seconds waited (speed was lesser than 0.1m/s)
#define KEEP_RIGHT_ACCEPTANCE
#define LOOK_FORWARD_LEFT
const MSLinkCont & getLinkCont() const
returns the container with all links !!!
SUMOReal getVehicleMaxSpeed(const SUMOVehicle *const veh) const
Returns the lane's maximum speed, given a vehicle's speed limit adaptation.
MSLane * getLane() const
Returns the lane the vehicle is on.
int influenceChangeDecision(int state)
allow TraCI to influence a lane change decision
The edge is an internal edge.
Representation of a lane in the micro simulation.
const MSCFModel & myCarFollowModel
The vehicle's car following model.
bool currentDistDisallows(SUMOReal dist, int laneOffset, SUMOReal lookForwardDist)
Interface for lane-change models.
int getBestLaneOffset() const
returns the current offset from the best lane
SUMOReal patchSpeed(const SUMOReal min, const SUMOReal wanted, const SUMOReal max, const MSCFModel &cfModel)
Called to adapt the speed in order to allow a lane change.
const std::string & getID() const
Returns the name of the vehicle.
The action is due to the wish to be faster (tactical lc)