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