MSCFModel_PWag2009.cpp

Go to the documentation of this file.
00001 /****************************************************************************/
00007 // Scalable model based on Krauß by Peter Wagner
00008 /****************************************************************************/
00009 // SUMO, Simulation of Urban MObility; see http://sumo.sourceforge.net/
00010 // Copyright 2001-2010 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 <microsim/MSAbstractLaneChangeModel.h>
00034 #include <utils/common/RandHelper.h>
00035 
00036 
00037 // ===========================================================================
00038 // method definitions
00039 // ===========================================================================
00040 MSCFModel_PWag2009::MSCFModel_PWag2009(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 * tau;
00045     myDecelDivTau = decel / tau;
00046 }
00047 
00048 
00049 MSCFModel_PWag2009::~MSCFModel_PWag2009() throw() {}
00050 
00051 
00052 SUMOReal
00053 MSCFModel_PWag2009::moveHelper(MSVehicle * const veh, const MSLane * const lane, SUMOReal vPos) const throw() {
00054     SUMOReal oldV = veh->getSpeed(); // save old v for optional acceleration computation
00055     SUMOReal vSafe = MIN2(vPos, veh->processNextStop(vPos)); // process stops
00056     // we need the acceleration for emission computation;
00057     //  in this case, we neglect dawdling, nonetheless, using
00058     //  vSafe does not incorporate speed reduction due to interaction
00059     //  on lane changing
00060     veh->setPreDawdleAcceleration(SPEED2ACCEL(vSafe-oldV));
00061     //
00062     SUMOReal vNext = vSafe;
00063     vNext =
00064         veh->getLaneChangeModel().patchSpeed(
00065             MAX2((SUMOReal) 0, oldV-(SUMOReal)ACCEL2SPEED(myDecel)), 
00066             vNext,
00067             MIN3(vSafe, veh->getLane().getMaxSpeed(), maxNextSpeed(oldV)),//vaccel(myState.mySpeed, myLane->maxSpeed())),
00068             vSafe);
00069     return MIN4(vNext, vSafe, veh->getLane().getMaxSpeed(), maxNextSpeed(oldV));
00070 }
00071 
00072 
00073 SUMOReal
00074 MSCFModel_PWag2009::ffeV(const MSVehicle * const veh, SUMOReal speed, SUMOReal gap, SUMOReal predSpeed) const throw() {
00075     return _v(speed, gap, predSpeed, maxNextSpeed(speed));
00076 }
00077 
00078 
00079 SUMOReal
00080 MSCFModel_PWag2009::ffeV(const MSVehicle * const veh, SUMOReal gap, SUMOReal predSpeed) const throw() {
00081     return _v(veh->getSpeed(), gap, predSpeed, maxNextSpeed(veh->getSpeed()));
00082 }
00083 
00084 
00085 SUMOReal
00086 MSCFModel_PWag2009::ffeV(const MSVehicle * const veh, const MSVehicle *pred) const throw() {
00087     return _v(veh->getSpeed(), veh->gap2pred(*pred), pred->getSpeed(), maxNextSpeed(veh->getSpeed()));
00088 }
00089 
00090 
00091 SUMOReal
00092 MSCFModel_PWag2009::ffeS(const MSVehicle * const veh, SUMOReal gap) const throw() {
00093     return _v(veh->getSpeed(), gap, 0, maxNextSpeed(veh->getSpeed()));
00094 }
00095 
00096 
00097 SUMOReal
00098 MSCFModel_PWag2009::interactionGap(const MSVehicle * const veh, SUMOReal vL) const throw() {
00099     // Resolve the vsafe equation to gap. Assume predecessor has
00100     // speed != 0 and that vsafe will be the current speed plus acceleration,
00101     // i.e that with this gap there will be no interaction.
00102     SUMOReal vNext = MIN2(maxNextSpeed(veh->getSpeed()), veh->getLane().getMaxSpeed());
00103     SUMOReal gap = (vNext - vL) *
00104                    ((veh->getSpeed() + vL) * myInverseTwoDecel + myTau) +
00105                    vL * myTau;
00106 
00107     // Don't allow timeHeadWay < deltaT situations.
00108     return MAX2(gap, SPEED2DIST(vNext));
00109 }
00110 
00111 
00112 bool
00113 MSCFModel_PWag2009::hasSafeGap(SUMOReal speed, SUMOReal gap, SUMOReal predSpeed, SUMOReal laneMaxSpeed) const throw() {
00114     if (gap<0) {
00115         return false;
00116     }
00117     SUMOReal vSafe = _v(speed, gap, predSpeed, maxNextSpeed(speed));
00118     SUMOReal vNext = MIN3(maxNextSpeed(speed), laneMaxSpeed, vSafe);
00119     return (vNext>=getSpeedAfterMaxDecel(speed) && gap>= SPEED2DIST(speed));
00120 }
00121 
00122 
00123 SUMOReal
00124 MSCFModel_PWag2009::dawdle(SUMOReal speed) const throw() {
00125     return MAX2(SUMOReal(0), speed - ACCEL2SPEED(myDawdle * myAccel * RandHelper::rand()));
00126 }
00127 
00128 
00129 SUMOReal
00130 MSCFModel_PWag2009::_v(SUMOReal speed, SUMOReal gap, SUMOReal predSpeed, SUMOReal vmax) const throw() {
00131     if (predSpeed==0&&gap<0.01) {
00132         return 0;
00133     }
00134     SUMOReal vsafe = -myTauDecel + sqrt(myTauDecel * myTauDecel + predSpeed * predSpeed + 2.0 * myDecel * gap);
00135     SUMOReal asafe = vsafe-speed;
00136     SUMOReal apref = asafe;
00137     if (RandHelper::rand()>.5) {
00138         apref = myDecelDivTau * (gap+(predSpeed-speed)*myTau-speed*myTau) / (speed+myTauDecel);
00139         apref += RandHelper::rand((SUMOReal)-1., (SUMOReal)1.);
00140         if (apref>asafe) apref = asafe;
00141     }
00142     return MAX2((SUMOReal)0, speed+apref);//ACCEL2SPEED(apref);
00143 }
00144 
00145 
00146 
00147 //void MSCFModel::saveState(std::ostream &os) {}
00148 

Generated on Wed May 5 00:06:31 2010 for Sumo - Simulation of Urban MObility by  doxygen 1.5.6