MSLane* MSEdge::getDepartLane(MSVehicle& veh) const { switch (veh.getParameter().departLaneProcedure) { case DEPART_LANE_GIVEN: if ((int) myLanes->size() <= veh.getParameter().departLane || !(*myLanes)[veh.getParameter().departLane]->allowsVehicleClass(veh.getVehicleType().getVehicleClass())) { return 0; } return (*myLanes)[veh.getParameter().departLane]; case DEPART_LANE_RANDOM: return RandHelper::getRandomFrom(*allowedLanes(veh.getVehicleType().getVehicleClass())); case DEPART_LANE_FREE: return getFreeLane(0, veh.getVehicleType().getVehicleClass()); case DEPART_LANE_ALLOWED_FREE: if (veh.getRoute().size() == 1) { return getFreeLane(0, veh.getVehicleType().getVehicleClass()); } else { return getFreeLane(allowedLanes(**(veh.getRoute().begin() + 1)), veh.getVehicleType().getVehicleClass()); } case DEPART_LANE_BEST_FREE: { veh.updateBestLanes(false, myLanes->front()); const std::vector<MSVehicle::LaneQ>& bl = veh.getBestLanes(); SUMOReal bestLength = -1; for (std::vector<MSVehicle::LaneQ>::const_iterator i = bl.begin(); i != bl.end(); ++i) { if ((*i).length > bestLength) { bestLength = (*i).length; } } std::vector<MSLane*>* bestLanes = new std::vector<MSLane*>(); for (std::vector<MSVehicle::LaneQ>::const_iterator i = bl.begin(); i != bl.end(); ++i) { if ((*i).length == bestLength) { bestLanes->push_back((*i).lane); } } MSLane* ret = getFreeLane(bestLanes, veh.getVehicleType().getVehicleClass()); delete bestLanes; return ret; } case DEPART_LANE_DEFAULT: case DEPART_LANE_FIRST_ALLOWED: for (std::vector<MSLane*>::const_iterator i = myLanes->begin(); i != myLanes->end(); ++i) { if ((*i)->allowsVehicleClass(veh.getVehicleType().getVehicleClass())) { return *i; } } return 0; default: break; } if (!(*myLanes)[0]->allowsVehicleClass(veh.getVehicleType().getVehicleClass())) { return 0; } return (*myLanes)[0]; }
MSLane* MSEdge::getFreeLane(const std::vector<MSLane*>* allowed, const SUMOVehicleClass vclass) const { if (allowed == 0) { allowed = allowedLanes(vclass); } MSLane* res = 0; if (allowed != 0) { unsigned int noCars = INT_MAX; for (std::vector<MSLane*>::const_iterator i = allowed->begin(); i != allowed->end(); ++i) { if ((*i)->getVehicleNumber() < noCars) { res = (*i); noCars = (*i)->getVehicleNumber(); } } } return res; }
MSLane* MSEdge::getFreeLane(const std::vector<MSLane*>* allowed, const SUMOVehicleClass vclass) const { if (allowed == 0) { allowed = allowedLanes(vclass); } MSLane* res = 0; if (allowed != 0) { SUMOReal leastOccupancy = std::numeric_limits<SUMOReal>::max();; for (std::vector<MSLane*>::const_iterator i = allowed->begin(); i != allowed->end(); ++i) { const SUMOReal occupancy = (*i)->getBruttoOccupancy(); if (occupancy < leastOccupancy) { res = (*i); leastOccupancy = occupancy; } } } return res; }
const std::vector<MSLane*>* MSEdge::allowedLanes(SUMOVehicleClass vclass) const { return allowedLanes(0, vclass); }
const std::vector<MSLane*>* MSEdge::allowedLanes(const MSEdge& destination, SUMOVehicleClass vclass) const { return allowedLanes(&destination, vclass); }