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_KraussOrig1.h"
00033 #include <microsim/MSAbstractLaneChangeModel.h>
00034 #include <utils/common/RandHelper.h>
00035
00036
00037
00038
00039
00040 MSCFModel_KraussOrig1::MSCFModel_KraussOrig1(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 * myTau;
00045 }
00046
00047
00048 MSCFModel_KraussOrig1::~MSCFModel_KraussOrig1() throw() {}
00049
00050
00051 SUMOReal
00052 MSCFModel_KraussOrig1::moveHelper(MSVehicle * const veh, const MSLane * const lane, SUMOReal vPos) const throw() {
00053 SUMOReal oldV = veh->getSpeed();
00054 SUMOReal vSafe = MIN2(vPos, veh->processNextStop(vPos));
00055
00056
00057
00058
00059 veh->setPreDawdleAcceleration(SPEED2ACCEL(vSafe-oldV));
00060
00061 SUMOReal vNext = dawdle(MIN3(lane->getMaxSpeed(), maxNextSpeed(oldV), vSafe));
00062 vNext =
00063 veh->getLaneChangeModel().patchSpeed(
00064 MAX2((SUMOReal) 0, oldV-(SUMOReal)ACCEL2SPEED(myDecel)),
00065 vNext,
00066 MIN3(vSafe, veh->getLane().getMaxSpeed(), maxNextSpeed(oldV)),
00067 vSafe);
00068 return MIN4(vNext, vSafe, veh->getLane().getMaxSpeed(), maxNextSpeed(oldV));
00069 }
00070
00071
00072 SUMOReal
00073 MSCFModel_KraussOrig1::ffeV(const MSVehicle * const veh, SUMOReal speed, SUMOReal gap, SUMOReal predSpeed) const throw() {
00074 return MIN2(_vsafe(gap, predSpeed), maxNextSpeed(speed));
00075 }
00076
00077
00078 SUMOReal
00079 MSCFModel_KraussOrig1::ffeV(const MSVehicle * const veh, SUMOReal gap, SUMOReal predSpeed) const throw() {
00080 return MIN2(_vsafe(gap, predSpeed), maxNextSpeed(veh->getSpeed()));
00081 }
00082
00083
00084 SUMOReal
00085 MSCFModel_KraussOrig1::ffeV(const MSVehicle * const veh, const MSVehicle *pred) const throw() {
00086 return MIN2(_vsafe(veh->gap2pred(*pred), pred->getSpeed()), maxNextSpeed(veh->getSpeed()));
00087 }
00088
00089
00090 SUMOReal
00091 MSCFModel_KraussOrig1::ffeS(const MSVehicle * const veh, SUMOReal gap) const throw() {
00092 return MIN2(_vsafe(gap, 0), maxNextSpeed(veh->getSpeed()));
00093 }
00094
00095
00096 SUMOReal
00097 MSCFModel_KraussOrig1::interactionGap(const MSVehicle * const veh, SUMOReal vL) const throw() {
00098
00099
00100
00101 SUMOReal vNext = MIN2(maxNextSpeed(veh->getSpeed()), veh->getLane().getMaxSpeed());
00102 SUMOReal gap = (vNext - vL) *
00103 ((veh->getSpeed() + vL) * myInverseTwoDecel + myTau) +
00104 vL * myTau;
00105
00106
00107 return MAX2(gap, SPEED2DIST(vNext));
00108 }
00109
00110
00111 bool
00112 MSCFModel_KraussOrig1::hasSafeGap(SUMOReal speed, SUMOReal gap, SUMOReal predSpeed, SUMOReal laneMaxSpeed) const throw() {
00113 if (gap<0) {
00114 return false;
00115 }
00116 SUMOReal vSafe = MIN2(_vsafe(gap, predSpeed), maxNextSpeed(speed));
00117 SUMOReal vNext = MIN3(maxNextSpeed(speed), laneMaxSpeed, vSafe);
00118 return (vNext>=getSpeedAfterMaxDecel(speed) && gap>= SPEED2DIST(speed));
00119 }
00120
00121
00122 SUMOReal
00123 MSCFModel_KraussOrig1::dawdle(SUMOReal speed) const throw() {
00124 return MAX2(SUMOReal(0), speed - ACCEL2SPEED(myDawdle * myAccel * RandHelper::rand()));
00125 }
00126
00127
00129 SUMOReal MSCFModel_KraussOrig1::_vsafe(SUMOReal gap, SUMOReal predSpeed) const throw() {
00130 if (predSpeed==0&&gap<0.01) {
00131 return 0;
00132 }
00133 SUMOReal vsafe = (SUMOReal)(-1. * myTauDecel
00134 + sqrt(
00135 myTauDecel*myTauDecel
00136 + (predSpeed*predSpeed)
00137 + (2. * myDecel * gap)
00138 ));
00139 assert(vsafe >= 0);
00140 return vsafe;
00141 }
00142
00143
00144
00145
00146