跟驰模型是SUMO平台内嵌的模型,源码都是C++源码
这些源码怎么用伪代码表示呢?
以下是Kruass跟驰模型
/****************************************************************************/
// Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.org/sumo
// Copyright (C) 2001-2021 German Aerospace Center (DLR) and others.
// This program and the accompanying materials are made available under the
// terms of the Eclipse Public License 2.0 which is available at
// https://www.eclipse.org/legal/epl-2.0/
// This Source Code may also be made available under the following Secondary
// Licenses when the conditions for such availability set forth in the Eclipse
// Public License 2.0 are satisfied: GNU General Public License, version 2
// or later which is available at
// https://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html
// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-or-later
/****************************************************************************/
/// @file MSCFModel_Krauss.cpp
/// @author Tobias Mayer
/// @author Daniel Krajzewicz
/// @author Jakob Erdmann
/// @author Michael Behrisch
/// @author Laura Bieker
/// @date Mon, 04 Aug 2009
///
// Krauss car-following model, with acceleration decrease and faster start
/****************************************************************************/
#include <config.h>
#include <microsim/MSVehicle.h>
#include <microsim/MSLane.h>
#include <microsim/MSGlobals.h>
#include "MSCFModel_Krauss.h"
#include <microsim/lcmodels/MSAbstractLaneChangeModel.h>
#include <utils/common/RandHelper.h>
// ===========================================================================
// DEBUG constants
// ===========================================================================
//#define DEBUG_COND (true)
#define DEBUG_COND (veh->isSelected())
#define DEBUG_DRIVER_ERRORS
// ===========================================================================
// method definitions
// ===========================================================================
MSCFModel_Krauss::MSCFModel_Krauss(const MSVehicleType* vtype) :
MSCFModel_KraussOrig1(vtype) {
}
MSCFModel_Krauss::~MSCFModel_Krauss() {}
double
MSCFModel_Krauss::patchSpeedBeforeLC(const MSVehicle* veh, double vMin, double vMax) const {
const double sigma = (veh->passingMinor()
? veh->getVehicleType().getParameter().getJMParam(SUMO_ATTR_JM_SIGMA_MINOR, myDawdle)
: myDawdle);
const double vDawdle = MAX2(vMin, dawdle2(vMax, sigma, veh->getRNG()));
return vDawdle;
}
double
MSCFModel_Krauss::stopSpeed(const MSVehicle* const veh, const double speed, double gap, double decel) const {
// NOTE: This allows return of smaller values than minNextSpeed().
// Only relevant for the ballistic update: We give the argument headway=veh->getActionStepLengthSecs(), to assure that
// the stopping position is approached with a uniform deceleration also for tau!=veh->getActionStepLengthSecs().
applyHeadwayPerceptionError(veh, speed, gap);
return MIN2(maximumSafeStopSpeed(gap, decel, speed, false, veh->getActionStepLengthSecs()), maxNextSpeed(speed, veh));
}
double
MSCFModel_Krauss::followSpeed(const MSVehicle* const veh, double speed, double gap, double predSpeed, double predMaxDecel, const MSVehicle* const pred) const {
//gDebugFlag1 = DEBUG_COND;
applyHeadwayAndSpeedDifferencePerceptionErrors(veh, speed, gap, predSpeed, predMaxDecel, pred);
//gDebugFlag1 = DEBUG_COND; // enable for DEBUG_EMERGENCYDECEL
const double vsafe = maximumSafeFollowSpeed(gap, speed, predSpeed, predMaxDecel);
//gDebugFlag1 = false;
const double vmin = minNextSpeedEmergency(speed);
const double vmax = maxNextSpeed(speed, veh);
if (MSGlobals::gSemiImplicitEulerUpdate) {
return MIN2(vsafe, vmax);
} else {
// ballistic
// XXX: the euler variant can break as strong as it wishes immediately! The ballistic cannot, refs. #2575.
return MAX2(MIN2(vsafe, vmax), vmin);
}
}
double
MSCFModel_Krauss::dawdle2(double speed, double sigma, std::mt19937* rng) const {
if (!MSGlobals::gSemiImplicitEulerUpdate) {
// in case of the ballistic update, negative speeds indicate
// a desired stop before the completion of the next timestep.
// We do not allow dawdling to overwrite this indication
if (speed < 0) {
return speed;
}
}
// generate random number out of [0,1)
const double random = RandHelper::rand(rng);
// Dawdle.
if (speed < myAccel) {
// we should not prevent vehicles from driving just due to dawdling
// if someone is starting, he should definitely start
// (but what about slow-to-start?)!!!
speed -= ACCEL2SPEED(sigma * speed * random);
} else {
speed -= ACCEL2SPEED(sigma * myAccel * random);
}
return MAX2(0., speed);
}
MSCFModel*
MSCFModel_Krauss::duplicate(const MSVehicleType* vtype) const {
return new MSCFModel_Krauss(vtype);
}
/****************************************************************************/
您的问题已经有小伙伴解答了,请点击【采纳】按钮,采纳帮您提供解决思路的答案,给回答的人一些鼓励哦~~
ps:开通问答VIP,享受5次/月 有问必答服务,了解详情↓↓↓
【电脑端】戳>>> https://vip.csdn.net/askvip?utm_source=1146287632
【APP 】 戳>>> https://mall.csdn.net/item/52471?utm_source=1146287632
你对伪代码的具体要求是什么样子啊,像流程图那样表示么。
这些函数编写的比较精炼啊,几乎不需要画流程了
如果是要表达函数的调用关系,可能光看这些代码也不够