42 #ifdef CHECK_MEMORY_LEAKS
44 #endif // CHECK_MEMORY_LEAKS
47 #ifdef DEBUG_VEHICLE_GUI_SELECTION
59 #define LOOK_FORWARD_SPEED_DIVIDER (SUMOReal)14.
61 #define LOOK_FORWARD_RIGHT (SUMOReal)10.
62 #define LOOK_FORWARD_LEFT (SUMOReal)20.
64 #define JAM_FACTOR (SUMOReal)1.
66 #define LCA_RIGHT_IMPATIENCE (SUMOReal)-1.
67 #define CUT_IN_LEFT_SPEED_THRESHOLD (SUMOReal)27.
69 #define LOOK_AHEAD_MIN_SPEED (SUMOReal)0.0
70 #define LOOK_AHEAD_SPEED_MEMORY (SUMOReal)0.9
71 #define LOOK_AHEAD_SPEED_DECREMENT 6.
73 #define HELP_DECEL_FACTOR (SUMOReal)1.0
75 #define HELP_OVERTAKE (SUMOReal)(10.0 / 3.6)
76 #define MIN_FALLBEHIND (SUMOReal)(14.0 / 3.6)
78 #define KEEP_RIGHT_HEADWAY (SUMOReal)2.0
80 #define URGENCY (SUMOReal)2.0
82 #define ROUNDABOUT_DIST_BONUS (SUMOReal)80.0
84 #define CHANGE_PROB_THRESHOLD_RIGHT (SUMOReal)2.0
85 #define CHANGE_PROB_THRESHOLD_LEFT (SUMOReal)0.2
86 #define KEEP_RIGHT_TIME (SUMOReal)5.0 // the number of seconds after which a vehicle should move to the right lane
87 #define KEEP_RIGHT_ACCEPTANCE (SUMOReal)2.0 // calibration factor for determining the desire to keep right
89 #define RELGAIN_NORMALIZATION_MIN_SPEED (SUMOReal)10.0
96 mySpeedGainProbability(0),
97 myKeepRightProbability(0),
98 myLeadingBlockerLength(0),
113 const std::pair<MSVehicle*, SUMOReal>& leader,
114 const std::pair<MSVehicle*, SUMOReal>& neighLead,
115 const std::pair<MSVehicle*, SUMOReal>& neighFollow,
117 const std::vector<MSVehicle::LaneQ>& preb,
120 const int result =
_wantsChange(laneOffset, msgPass, blocked, leader, neighLead, neighFollow, neighLane, preb, lastBlocked, firstBlocked);
147 return MAX2(min, safe);
154 for (std::vector<SUMOReal>::const_iterator i =
myVSafes.begin(); i !=
myVSafes.end(); ++i) {
156 if (v >= min && v <= max) {
157 nVSafe =
MIN2(v, nVSafe);
172 return (max + wanted) / (
SUMOReal) 2.0;
176 return (min + wanted) / (
SUMOReal) 2.0;
179 return (max + wanted) / (
SUMOReal) 2.0;
187 return (max + wanted) / (
SUMOReal) 2.0;
214 const std::pair<MSVehicle*, SUMOReal>& neighLead,
218 for (std::vector<SUMOReal>::const_iterator i =
myVSafes.begin(); i !=
myVSafes.end(); ++i) {
221 plannedSpeed =
MIN2(plannedSpeed, v);
225 assert(neighLead.first != 0);
229 const SUMOReal overtakeDist = (neighLead.second
241 || dv * remainingSeconds < overtakeDist) {
264 }
else if (neighLead.first != 0) {
272 return MIN2(targetSpeed, plannedSpeed);
284 const std::pair<MSVehicle*, SUMOReal>& neighFollow,
288 assert(neighFollow.first != 0);
294 if ((neededGap - neighFollow.second) / remainingSeconds < (plannedSpeed - nv->
getSpeed())) {
312 const SUMOReal dv = plannedSpeed - neighNewSpeed1s;
314 const SUMOReal decelGap = neighFollow.second + dv;
316 if (decelGap > 0 && decelGap >= secureGap) {
322 }
else if (dv > 0 && dv * remainingSeconds > (secureGap - decelGap +
POSITION_EPS)) {
343 const SUMOReal overtakeDist = (neighFollow.second
349 const SUMOReal needDV = overtakeDist / remainingSeconds;
393 const std::pair<MSVehicle*, SUMOReal>& leader,
394 const std::pair<MSVehicle*, SUMOReal>& neighLead,
395 const std::pair<MSVehicle*, SUMOReal>& neighFollow,
397 const std::vector<MSVehicle::LaneQ>& preb,
400 assert(laneOffset == 1 || laneOffset == -1);
404 int bestLaneOffset = 0;
413 for (
int p = 0; p < (
int) preb.size(); ++p) {
414 if (preb[p].lane == prebLane && p + laneOffset >= 0) {
415 assert(p + laneOffset < (
int)preb.size());
417 neigh = preb[p + laneOffset];
418 currentDist = curr.
length;
420 bestLaneOffset = curr.bestLaneOffset;
421 if (bestLaneOffset == 0 && preb[p + laneOffset].bestLaneOffset == 0) {
422 bestLaneOffset = laneOffset;
424 best = preb[p + bestLaneOffset];
430 const bool right = (laneOffset == -1);
434 const bool changeToBest = (right && bestLaneOffset < 0) || (!right && bestLaneOffset > 0);
440 if (lastBlocked != firstBlocked) {
472 int roundaboutEdgesAhead = 0;
474 if ((*it) != 0 && (*it)->getEdge().isRoundabout()) {
475 roundaboutEdgesAhead += 1;
476 }
else if (roundaboutEdgesAhead > 0) {
481 int roundaboutEdgesAheadNeigh = 0;
483 if ((*it) != 0 && (*it)->getEdge().isRoundabout()) {
484 roundaboutEdgesAheadNeigh += 1;
485 }
else if (roundaboutEdgesAheadNeigh > 0) {
490 if (roundaboutEdgesAhead > 1) {
496 const SUMOReal maxJam =
MAX2(preb[currIdx + laneOffset].occupation, preb[currIdx].occupation);
526 }
else if (bestLaneOffset == 0 && (neighLeftPlace * 2. < laDist)) {
536 if ((ret & lcaCounter) != 0) {
548 if (changeToBest &&
abs(bestLaneOffset) > 1) {
556 if (*firstBlocked != neighLead.first) {
563 const SUMOReal plannedSpeed =
informLeader(msgPass, blocked, myLca, neighLead, remainingSeconds);
564 if (plannedSpeed >= 0) {
566 informFollower(msgPass, blocked, myLca, neighFollow, remainingSeconds, plannedSpeed);
572 if (roundaboutEdgesAhead > 1) {
629 if (neighLead.first == 0) {
634 &
myVehicle,
myVehicle.
getSpeed(), neighLead.second, neighLead.first->getSpeed(), neighLead.first->getCarFollowModel().getMaxDecel()));
636 if (leader.first == 0) {
644 thisLaneVSafe =
MIN2(thisLaneVSafe, vMax);
645 neighLaneVSafe =
MIN2(neighLaneVSafe, vMax);
646 const SUMOReal relativeGain = (neighLaneVSafe - thisLaneVSafe) /
MAX2(neighLaneVSafe,
651 if (thisLaneVSafe - 5 / 3.6 > neighLaneVSafe) {
666 SUMOReal fullSpeedDrivingSeconds =
MIN2(acceptanceTime, fullSpeedGap / vMax);
667 if (neighLead.first != 0 && neighLead.first->getSpeed() < vMax) {
670 vMax, neighLead.first->getSpeed(), neighLead.first->getCarFollowModel().getMaxDecel())));
671 fullSpeedDrivingSeconds =
MIN2(fullSpeedDrivingSeconds, fullSpeedGap / (vMax - neighLead.first->getSpeed()));
682 <<
" neighDist=" << neighDist
684 <<
" leaderSpeed=" << (neighLead.first == 0 ? -1 : neighLead.first->getSpeed())
686 myVehicle.
getSpeed(), neighLead.first->getSpeed(), neighLead.first->getCarFollowModel().getMaxDecel()))
687 <<
" acceptanceTime=" << acceptanceTime
688 <<
" fullSpeedGap=" << fullSpeedGap
689 <<
" fullSpeedDrivingSeconds=" << fullSpeedDrivingSeconds
690 <<
" dProb=" << deltaProb
710 if (thisLaneVSafe > neighLaneVSafe) {
728 && (right ? mySpeedGainProbability < 0 : mySpeedGainProbability > 0)) {
743 if ((*blocked) != 0) {
755 (*blocked)->getCarFollowModel().getMaxDecel()));