00001
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #ifdef _MSC_VER
00025 #include <windows_config.h>
00026 #else
00027 #include <config.h>
00028 #endif
00029
00030 #include <microsim/MSVehicle.h>
00031 #include <microsim/MSLane.h>
00032 #include "MSCFModel_PWag2009.h"
00033 #include <microsim/MSAbstractLaneChangeModel.h>
00034 #include <utils/common/RandHelper.h>
00035
00036
00037
00038
00039
00040 MSCFModel_PWag2009::MSCFModel_PWag2009(const MSVehicleType* vtype, SUMOReal accel, SUMOReal decel,
00041 SUMOReal dawdle, SUMOReal tau) throw()
00042 : MSCFModel(vtype, decel), myAccel(accel), myDawdle(dawdle), myTau(tau) {
00043
00044 myTauDecel = decel * tau;
00045 myDecelDivTau = decel / tau;
00046 }
00047
00048
00049 MSCFModel_PWag2009::~MSCFModel_PWag2009() throw() {}
00050
00051
00052 SUMOReal
00053 MSCFModel_PWag2009::moveHelper(MSVehicle * const veh, const MSLane * const lane, SUMOReal vPos) const throw() {
00054 SUMOReal oldV = veh->getSpeed();
00055 SUMOReal vSafe = MIN2(vPos, veh->processNextStop(vPos));
00056
00057
00058
00059
00060 veh->setPreDawdleAcceleration(SPEED2ACCEL(vSafe-oldV));
00061
00062 SUMOReal vNext = vSafe;
00063 vNext =
00064 veh->getLaneChangeModel().patchSpeed(
00065 MAX2((SUMOReal) 0, oldV-(SUMOReal)ACCEL2SPEED(myDecel)),
00066 vNext,
00067 MIN3(vSafe, veh->getLane().getMaxSpeed(), maxNextSpeed(oldV)),
00068 vSafe);
00069 return MIN4(vNext, vSafe, veh->getLane().getMaxSpeed(), maxNextSpeed(oldV));
00070 }
00071
00072
00073 SUMOReal
00074 MSCFModel_PWag2009::ffeV(const MSVehicle * const veh, SUMOReal speed, SUMOReal gap, SUMOReal predSpeed) const throw() {
00075 return _v(speed, gap, predSpeed, maxNextSpeed(speed));
00076 }
00077
00078
00079 SUMOReal
00080 MSCFModel_PWag2009::ffeV(const MSVehicle * const veh, SUMOReal gap, SUMOReal predSpeed) const throw() {
00081 return _v(veh->getSpeed(), gap, predSpeed, maxNextSpeed(veh->getSpeed()));
00082 }
00083
00084
00085 SUMOReal
00086 MSCFModel_PWag2009::ffeV(const MSVehicle * const veh, const MSVehicle *pred) const throw() {
00087 return _v(veh->getSpeed(), veh->gap2pred(*pred), pred->getSpeed(), maxNextSpeed(veh->getSpeed()));
00088 }
00089
00090
00091 SUMOReal
00092 MSCFModel_PWag2009::ffeS(const MSVehicle * const veh, SUMOReal gap) const throw() {
00093 return _v(veh->getSpeed(), gap, 0, maxNextSpeed(veh->getSpeed()));
00094 }
00095
00096
00097 SUMOReal
00098 MSCFModel_PWag2009::interactionGap(const MSVehicle * const veh, SUMOReal vL) const throw() {
00099
00100
00101
00102 SUMOReal vNext = MIN2(maxNextSpeed(veh->getSpeed()), veh->getLane().getMaxSpeed());
00103 SUMOReal gap = (vNext - vL) *
00104 ((veh->getSpeed() + vL) * myInverseTwoDecel + myTau) +
00105 vL * myTau;
00106
00107
00108 return MAX2(gap, SPEED2DIST(vNext));
00109 }
00110
00111
00112 bool
00113 MSCFModel_PWag2009::hasSafeGap(SUMOReal speed, SUMOReal gap, SUMOReal predSpeed, SUMOReal laneMaxSpeed) const throw() {
00114 if (gap<0) {
00115 return false;
00116 }
00117 SUMOReal vSafe = _v(speed, gap, predSpeed, maxNextSpeed(speed));
00118 SUMOReal vNext = MIN3(maxNextSpeed(speed), laneMaxSpeed, vSafe);
00119 return (vNext>=getSpeedAfterMaxDecel(speed) && gap>= SPEED2DIST(speed));
00120 }
00121
00122
00123 SUMOReal
00124 MSCFModel_PWag2009::dawdle(SUMOReal speed) const throw() {
00125 return MAX2(SUMOReal(0), speed - ACCEL2SPEED(myDawdle * myAccel * RandHelper::rand()));
00126 }
00127
00128
00129 SUMOReal
00130 MSCFModel_PWag2009::_v(SUMOReal speed, SUMOReal gap, SUMOReal predSpeed, SUMOReal vmax) const throw() {
00131 if (predSpeed==0&&gap<0.01) {
00132 return 0;
00133 }
00134 SUMOReal vsafe = -myTauDecel + sqrt(myTauDecel * myTauDecel + predSpeed * predSpeed + 2.0 * myDecel * gap);
00135 SUMOReal asafe = vsafe-speed;
00136 SUMOReal apref = asafe;
00137 if (RandHelper::rand()>.5) {
00138 apref = myDecelDivTau * (gap+(predSpeed-speed)*myTau-speed*myTau) / (speed+myTauDecel);
00139 apref += RandHelper::rand((SUMOReal)-1., (SUMOReal)1.);
00140 if (apref>asafe) apref = asafe;
00141 }
00142 return MAX2((SUMOReal)0, speed+apref);
00143 }
00144
00145
00146
00147
00148