SUMOReal MSCFModel_SmartSK::moveHelper(MSVehicle* const veh, SUMOReal vPos) const { const SUMOReal oldV = veh->getSpeed(); // save old v for optional acceleration computation const SUMOReal vSafe = MIN2(vPos, veh->processNextStop(vPos)); // process stops // we need the acceleration for emission computation; // in this case, we neglect dawdling, nonetheless, using // vSafe does not incorporate speed reduction due to interaction // on lane changing const SUMOReal vMin = getSpeedAfterMaxDecel(oldV); const SUMOReal vMax = MIN3(veh->getLane()->getVehicleMaxSpeed(veh), maxNextSpeed(oldV, veh), vSafe); #ifdef _DEBUG if (vMin > vMax) { WRITE_WARNING("Vehicle's '" + veh->getID() + "' maximum speed is lower than the minimum speed (min: " + toString(vMin) + ", max: " + toString(vMax) + ")."); } #endif updateMyHeadway(veh); SSKVehicleVariables* vars = (SSKVehicleVariables*)veh->getCarFollowVariables(); #ifdef _DEBUG if (vars->ggOld.size() > 1) { std::cout << "# more than one entry in ggOld list. Speed is " << vPos << ", corresponding dist is " << vars->ggOld[(int) vPos] << "\n"; for (std::map<int, SUMOReal>::iterator I = vars->ggOld.begin(); I != vars->ggOld.end(); I++) { std::cout << "# " << (*I).first << ' ' << (*I).second << std::endl; } } #endif vars->gOld = vars->ggOld[(int) vPos]; vars->ggOld.clear(); return veh->getLaneChangeModel().patchSpeed(vMin, MAX2(vMin, dawdle(vMax)), vMax, *this); }
bool MSCFModel_KraussOrig1::hasSafeGap(SUMOReal speed, SUMOReal gap, SUMOReal predSpeed, SUMOReal laneMaxSpeed) const throw() { if (gap<0) { return false; } SUMOReal vSafe = MIN2(_vsafe(gap, predSpeed), maxNextSpeed(speed)); SUMOReal vNext = MIN3(maxNextSpeed(speed), laneMaxSpeed, vSafe); return (vNext>=getSpeedAfterMaxDecel(speed) && gap>= SPEED2DIST(speed)); }
SUMOReal MSCFModel_Wiedemann::stopSpeed(const MSVehicle* const veh, const SUMOReal speed, SUMOReal gap) const { /* Wiedemann does not handle approaching junctions or stops very well: * regime approaching() fails when dv = 0 (i.e. a vehicle inserted with speed 0 does not accelerate to reach a stop) * for dv ~ 0 the standard decision tree will switch to following() which * does a lousy job of closing in on a stop / junction * hence we borrow from Krauss here */ return MAX2(getSpeedAfterMaxDecel(speed), MIN2(krauss_vsafe(gap, 0), maxNextSpeed(speed, veh))); }
SUMOReal MSCFModel_SmartSK::stopSpeed(const MSVehicle* const veh, const SUMOReal speed, SUMOReal gap) const { SSKVehicleVariables* vars = (SSKVehicleVariables*)veh->getCarFollowVariables(); // if (((gap - vars->gOld) < maxDeltaGap) && (speed>=5.0) && gap>=5.0) { if ((gap - vars->gOld) < maxDeltaGap) { SUMOReal tTauTest = gap / speed; // allow headway only to decrease only, never to increase. Increase is handled automatically by the headway dynamics in moveHelper()!!! if ((tTauTest < vars->myHeadway) && (tTauTest > TS)) { vars->myHeadway = tTauTest; } } return MAX2(getSpeedAfterMaxDecel(speed), MIN2(_vsafe(veh, gap, 0), maxNextSpeed(speed, veh))); }
SUMOReal MSCFModel_Daniel1::moveHelper(MSVehicle* const veh, SUMOReal vPos) const { const SUMOReal oldV = veh->getSpeed(); // save old v for optional acceleration computation const SUMOReal vSafe = MIN2(vPos, veh->processNextStop(vPos)); // process stops // we need the acceleration for emission computation; // in this case, we neglect dawdling, nonetheless, using // vSafe does not incorporate speed reduction due to interaction // on lane changing const SUMOReal vMin = getSpeedAfterMaxDecel(oldV); const SUMOReal vMax = MIN3(veh->getLane()->getVehicleMaxSpeed(veh), maxNextSpeed(oldV, veh), vSafe); #ifdef _DEBUG if (vMin > vMax) { WRITE_WARNING("Vehicle's '" + veh->getID() + "' maximum speed is lower than the minimum speed (min: " + toString(vMin) + ", max: " + toString(vMax) + ")."); } #endif return veh->getLaneChangeModel().patchSpeed(vMin, MAX2(vMin, dawdle(vMax)), vMax, *this); }
SUMOReal MSCFModel_SmartSK::followSpeed(const MSVehicle* const veh, SUMOReal speed, SUMOReal gap, SUMOReal predSpeed, SUMOReal /*predMaxDecel*/) const { SSKVehicleVariables* vars = (SSKVehicleVariables*)veh->getCarFollowVariables(); // if (((gap - vars->gOld) < maxDeltaGap) && (speed>=5.0) && gap>=5.0) { if ((gap - vars->gOld) < maxDeltaGap) { SUMOReal tTauTest = gap / speed; // allow headway only to decrease only, never to increase. Increase is handled automatically by the headway dynamics in moveHelper()!!! if ((tTauTest < vars->myHeadway) && (tTauTest > TS)) { vars->myHeadway = tTauTest; } } SUMOReal vsafe = _vsafe(veh, gap, predSpeed); if ((speed <= 0.0) && (vsafe < myS2Sspeed)) { vsafe = 0; } SUMOReal vNew = MAX2(getSpeedAfterMaxDecel(speed), MIN2(vsafe, maxNextSpeed(speed, veh))); // there must be a better place to do the following assignment!!! vars->gOld = gap; vars->ggOld[(int)vNew] = gap; return vNew; }