SUMO - Simulation of Urban MObility
|
00001 /****************************************************************************/ 00009 // car-following model by B. Kerner 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_Kerner.h" 00036 #include <utils/common/RandHelper.h> 00037 00038 00039 // =========================================================================== 00040 // method definitions 00041 // =========================================================================== 00042 MSCFModel_Kerner::MSCFModel_Kerner(const MSVehicleType* vtype, SUMOReal accel, 00043 SUMOReal decel, SUMOReal headwayTime, SUMOReal k, SUMOReal phi) 00044 : MSCFModel(vtype, accel, decel, headwayTime), myK(k), myPhi(phi), myTauDecel(decel* headwayTime) { 00045 } 00046 00047 00048 MSCFModel_Kerner::~MSCFModel_Kerner() {} 00049 00050 00051 SUMOReal 00052 MSCFModel_Kerner::followSpeed(const MSVehicle* const /*veh*/, SUMOReal speed, SUMOReal gap, SUMOReal predSpeed, SUMOReal /*predMaxDecel*/) const { 00053 return MIN2(_v(speed, maxNextSpeed(speed), gap, predSpeed), maxNextSpeed(speed)); 00054 } 00055 00056 00057 SUMOReal 00058 MSCFModel_Kerner::stopSpeed(const MSVehicle* const veh, SUMOReal gap) const { 00059 const SUMOReal speed = veh->getSpeed(); 00060 return MIN2(_v(speed, maxNextSpeed(speed), gap, 0), maxNextSpeed(speed)); 00061 } 00062 00063 00064 SUMOReal 00065 MSCFModel_Kerner::_v(SUMOReal speed, SUMOReal vfree, SUMOReal gap, SUMOReal predSpeed) const { 00066 if (predSpeed == 0 && gap < 0.01) { 00067 return 0; 00068 } 00069 // !!! in the following, the prior step is not considered!!! 00070 SUMOReal G = MAX2((SUMOReal) 0, (SUMOReal)(SPEED2DIST(myK * speed) + myPhi / myAccel * speed * (speed - predSpeed))); 00071 SUMOReal vcond = gap > G ? speed + ACCEL2SPEED(myAccel) : speed + MAX2(ACCEL2SPEED(-myDecel), MIN2(ACCEL2SPEED(myAccel), predSpeed - speed)); 00072 SUMOReal vsafe = (SUMOReal)(-1. * myTauDecel + sqrt(myTauDecel * myTauDecel + (predSpeed * predSpeed) + (2. * myDecel * gap))); 00073 SUMOReal va = MAX2((SUMOReal) 0, MIN3(vfree, vsafe, vcond)) + RandHelper::rand(); 00074 SUMOReal v = MAX2((SUMOReal) 0, MIN4(vfree, va, speed + ACCEL2SPEED(myAccel), vsafe)); 00075 return v; 00076 } 00077 00078 00079 MSCFModel* 00080 MSCFModel_Kerner::duplicate(const MSVehicleType* vtype) const { 00081 return new MSCFModel_Kerner(vtype, myAccel, myDecel, myHeadwayTime, myK, myPhi); 00082 }