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