|
SUMO - Simulation of Urban MObility
|
00001 /****************************************************************************/ 00007 // Scalable model based on Krauß by Peter Wagner 00008 /****************************************************************************/ 00009 // SUMO, Simulation of Urban MObility; see http://sumo.sourceforge.net/ 00010 // Copyright (C) 2001-2011 DLR (http://www.dlr.de/) and contributors 00011 /****************************************************************************/ 00012 // 00013 // This program is free software; you can redistribute it and/or modify 00014 // it under the terms of the GNU General Public License as published by 00015 // the Free Software Foundation; either version 2 of the License, or 00016 // (at your option) any later version. 00017 // 00018 /****************************************************************************/ 00019 00020 00021 // =========================================================================== 00022 // included modules 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 <utils/common/RandHelper.h> 00034 00035 00036 // =========================================================================== 00037 // method definitions 00038 // =========================================================================== 00039 MSCFModel_PWag2009::MSCFModel_PWag2009(const MSVehicleType* vtype, SUMOReal accel, SUMOReal decel, 00040 SUMOReal dawdle, SUMOReal headwayTime, SUMOReal tauLast, SUMOReal apProb) 00041 : MSCFModel(vtype, accel, decel, headwayTime), myDawdle(dawdle), 00042 myTauDecel(decel* headwayTime), myDecelDivTau(decel / headwayTime), myTauLastDecel(decel* tauLast), 00043 myActionPointProbability(apProb) { 00044 } 00045 00046 00047 MSCFModel_PWag2009::~MSCFModel_PWag2009() {} 00048 00049 00050 SUMOReal 00051 MSCFModel_PWag2009::moveHelper(MSVehicle* const veh, SUMOReal vPos) const { 00052 const SUMOReal vNext = MSCFModel::moveHelper(veh, vPos); 00053 const SUMOReal speed = veh->getSpeed(); 00054 VehicleVariables* vars = (VehicleVariables*)veh->getCarFollowVariables(); 00055 // model should re-use acceleration from previous time-step: 00056 SUMOReal apref = vars->aOld; 00057 const SUMOReal asafe = SPEED2ACCEL(vNext-speed); 00058 if (apref <= asafe && RandHelper::rand() > myActionPointProbability*TS) { 00059 std::pair<MSVehicle* const, SUMOReal> l = veh->getLane()->getLeaderOnConsecutive(100., 0., speed, *veh, veh->getBestLanesContinuation(veh->getLane())); 00060 if (l.first) { 00061 apref = myDecelDivTau * (l.second+(l.first->getSpeed()-speed)*myHeadwayTime-speed*myHeadwayTime) / (speed+myTauDecel); 00062 apref += myDawdle*RandHelper::rand((SUMOReal)-1., (SUMOReal)1.); 00063 } 00064 } 00065 if (apref > asafe) { 00066 apref = asafe; 00067 } 00068 vars->aOld = apref; // save this value for the next time-step 00069 return MAX2((SUMOReal)0, speed + ACCEL2SPEED(apref)); 00070 } 00071 00072 00073 SUMOReal 00074 MSCFModel_PWag2009::followSpeed(const MSVehicle* const veh, SUMOReal speed, SUMOReal gap, SUMOReal predSpeed, SUMOReal /*predMaxDecel*/) const { 00075 return _v(veh, speed, gap, predSpeed); 00076 } 00077 00078 00079 SUMOReal 00080 MSCFModel_PWag2009::stopSpeed(const MSVehicle* const veh, SUMOReal gap) const { 00081 return _v(veh, veh->getSpeed(), gap, 0); 00082 } 00083 00084 00085 SUMOReal 00086 MSCFModel_PWag2009::dawdle(SUMOReal speed) const { 00087 return MAX2(SUMOReal(0), speed - ACCEL2SPEED(myDawdle * myAccel * RandHelper::rand())); 00088 } 00089 00090 // in addition, the parameters myTauLast, probAP, and sigmaAcc are needed; sigmaAcc can use myDawdle 00091 // myTauLast might use the current time-step size, but this yields eventually an extreme model, I would be 00092 // more careful and set it to something around 0.3 or 0.4, which are among the shortest headways I have 00093 // seen so far in data ... 00094 SUMOReal 00095 MSCFModel_PWag2009::_v(const MSVehicle* const veh, SUMOReal speed, SUMOReal gap, SUMOReal predSpeed) const { 00096 if (predSpeed==0&&gap<0.01) { 00097 return 0; 00098 } 00099 const SUMOReal vsafe = -myTauLastDecel + sqrt(myTauLastDecel * myTauLastDecel + predSpeed * predSpeed + 2.0 * myDecel * gap); 00100 return MAX2((SUMOReal)0, vsafe); 00101 } 00102 00103 00104 MSCFModel* 00105 MSCFModel_PWag2009::duplicate(const MSVehicleType* vtype) const { 00106 return new MSCFModel_PWag2009(vtype, myAccel, myDecel, myDawdle, myHeadwayTime, myTauLastDecel/myDecel, myActionPointProbability); 00107 }