void MSDevice_Routing::buildVehicleDevices(MSVehicle &v, std::vector<MSDevice*> &into) throw() { OptionsCont &oc = OptionsCont::getOptions(); if (oc.getFloat("device.routing.probability")==0&&!oc.isSet("device.routing.knownveh")) { // no route computation is modelled return; } // route computation is enabled bool haveByNumber = false; if (oc.getBool("device.routing.deterministic")) { haveByNumber = ((myVehicleIndex%1000) < (int)(oc.getFloat("device.routing.probability")*1000.)); } else { haveByNumber = RandHelper::rand()<=oc.getFloat("device.routing.probability"); } bool haveByName = oc.isSet("device.routing.knownveh") && OptionsCont::getOptions().isInStringVector("device.routing.knownveh", v.getID()); if (haveByNumber||haveByName) { // build the device MSDevice_Routing* device = new MSDevice_Routing(v, "routing_" + v.getID(), string2time(oc.getString("device.routing.period")), string2time(oc.getString("device.routing.pre-period"))); into.push_back(device); // initialise edge efforts if not done before if (myEdgeEfforts.size()==0) { const std::vector<MSEdge*> &edges = MSNet::getInstance()->getEdgeControl().getEdges(); for (std::vector<MSEdge*>::const_iterator i=edges.begin(); i!=edges.end(); ++i) { myEdgeEfforts[*i] = (*i)->getCurrentTravelTime(); } } // make the weights be updated if (myEdgeWeightSettingCommand==0) { myEdgeWeightSettingCommand = new StaticCommand< MSDevice_Routing >(&MSDevice_Routing::adaptEdgeEfforts); MSNet::getInstance()->getEndOfTimestepEvents().addEvent( myEdgeWeightSettingCommand, 0, MSEventControl::ADAPT_AFTER_EXECUTION); myAdaptationWeight = oc.getFloat("device.routing.adaptation-weight"); myAdaptationInterval = string2time(oc.getString("device.routing.adaptation-interval")); } myWithTaz = oc.getBool("device.routing.with-taz"); if (myWithTaz) { if (MSEdge::dictionary(v.getParameter().fromTaz+"-source") == 0) { WRITE_ERROR("Source district '" + v.getParameter().fromTaz + "' not known when rerouting '" + v.getID() + "'!"); return; } if (MSEdge::dictionary(v.getParameter().toTaz+"-sink") == 0) { WRITE_ERROR("Destination district '" + v.getParameter().toTaz + "' not known when rerouting '" + v.getID() + "'!"); return; } } } myVehicleIndex++; }
bool MSLane::emit(MSVehicle& veh) throw(ProcessError) { SUMOReal pos = 0; SUMOReal speed = 0; bool patchSpeed = true; // whether the speed shall be adapted to infrastructure/traffic in front // determine the speed const SUMOVehicleParameter &pars = veh.getParameter(); size_t stripId = getEmptyStartStripID(veh.getWidth()); switch (pars.departSpeedProcedure) { case DEPART_SPEED_GIVEN: speed = pars.departSpeed; patchSpeed = false; break; case DEPART_SPEED_RANDOM: speed = RandHelper::rand(MIN2(veh.getMaxSpeed(), getMaxSpeed())); patchSpeed = true; // !!!(?) break; case DEPART_SPEED_MAX: speed = MIN2(veh.getMaxSpeed(), getMaxSpeed()); patchSpeed = true; // !!!(?) break; case DEPART_SPEED_DEFAULT: default: // speed = 0 was set before patchSpeed = false; // !!!(?) break; } // determine the position switch (pars.departPosProcedure) { case DEPART_POS_GIVEN: if (pars.departPos >= 0.) { pos = pars.departPos; } else { pos = pars.departPos + getLength(); } break; case DEPART_POS_RANDOM: pos = RandHelper::rand(getLength()); break; case DEPART_POS_RANDOM_FREE: { for (unsigned int i=0; i < 10; i++) { // we will try some random positions ... pos = RandHelper::rand(getLength()); if (isEmissionSuccess(&veh, speed, pos, patchSpeed, stripId)) { return true; } } // ... and if that doesn't work, we put the vehicle to the free position return freeEmit(veh, speed); } break; case DEPART_POS_FREE: return freeEmit(veh, speed); case DEPART_POS_DEFAULT: default: // pos = 0 was set before break; } // try to emit return isEmissionSuccess(&veh, speed, pos, patchSpeed, stripId); }
void MSRouteHandler::closeVehicle() throw(ProcessError) { if (myVehicleParameter->departProcedure == DEPART_GIVEN) { myLastDepart = myVehicleParameter->depart; // let's check whether this vehicle had to be emitted before the simulation starts if (myVehicleParameter->depart<string2time(OptionsCont::getOptions().getString("begin"))) { return; } } // get the vehicle's type MSVehicleType *vtype = 0; if (myVehicleParameter->vtypeid!="") { vtype = MSNet::getInstance()->getVehicleControl().getVType(myVehicleParameter->vtypeid); if (vtype==0) { throw ProcessError("The vehicle type '" + myVehicleParameter->vtypeid + "' for vehicle '" + myVehicleParameter->id + "' is not known."); } } else { // there should be one (at least the default one) vtype = MSNet::getInstance()->getVehicleControl().getVType(); } // get the vehicle's route // maybe it was explicitely assigned to the vehicle const MSRoute *route = MSRoute::dictionary("!" + myVehicleParameter->id); if (route==0) { // if not, try via the (hopefully) given route-id route = MSRoute::dictionary(myVehicleParameter->routeid); } if (route==0) { // nothing found? -> error if (myVehicleParameter->routeid!="") { throw ProcessError("The route '" + myVehicleParameter->routeid + "' for vehicle '" + myVehicleParameter->id + "' is not known."); } else { throw ProcessError("Vehicle '" + myVehicleParameter->id + "' has no route."); } } myActiveRouteID = ""; // try to build the vehicle MSVehicle *vehicle = 0; if (MSNet::getInstance()->getVehicleControl().getVehicle(myVehicleParameter->id)==0) { // ok there was no other vehicle with the same id, yet // maybe we do not want this vehicle to be emitted due to using incremental dua bool add = true; if (myAmUsingIncrementalDUA) { if ((int)(myRunningVehicleNumber%myIncrementalBase)>=(int) myIncrementalStage) { add = false; } myRunningVehicleNumber++; } if (add) { vehicle = MSNet::getInstance()->getVehicleControl().buildVehicle(myVehicleParameter, route, vtype); // add the vehicle to the vehicle control MSNet::getInstance()->getVehicleControl().addVehicle(myVehicleParameter->id, vehicle); if (myVehicleParameter->departProcedure == DEPART_TRIGGERED) { MSNet::getInstance()->getVehicleControl().addWaiting(*route->begin(), vehicle); } myVehicleParameter = 0; } } else { // strange: another vehicle with the same id already exists #ifdef HAVE_MESOSIM if (!MSGlobals::gStateLoaded) { #endif // and was not loaded while loading a simulation state // -> error throw ProcessError("Another vehicle with the id '" + myVehicleParameter->id + "' exists."); #ifdef HAVE_MESOSIM } else { // ok, it seems to be loaded previously while loading a simulation state vehicle = 0; } #endif } // check whether the vehicle shall be added directly to the network or // shall stay in the internal buffer if (myAddVehiclesDirectly&&vehicle!=0) { if (vehicle->getParameter().departProcedure == DEPART_GIVEN) { MSNet::getInstance()->getEmitControl().add(vehicle); } } else { myLastReadVehicle = vehicle; } }