35 #define DEBUG_COND2(obj) (true)
43 int numDispatched = 0;
46 std::set<MSDevice_Taxi*, MSVehicleDevice::ComparatorNumericalVehicleIdLess> available;
47 for (
auto* taxi : fleet) {
48 if (taxi->isEmpty()) {
49 available.insert(taxi);
55 std::sort(reservations.begin(), reservations.end(),
time_sorter());
57 std::cout <<
SIMTIME <<
" computeDispatch fleet=" << fleet.size() <<
" available=" << available.size() <<
" reservations=" <<
toString(reservations) <<
"\n";
59 for (
auto it = reservations.begin(); it != reservations.end();) {
60 if (available.size() == 0) {
72 bool tooEarly =
false;
73 for (
auto* taxi : available) {
74 if (taxi->getHolder().getVehicleType().getPersonCapacity() < (
int)res->
persons.size()) {
78 #ifdef DEBUG_TRAVELTIME
83 if (travelTime < closestTime) {
84 closestTime = travelTime;
95 if (tooEarly || closest ==
nullptr) {
100 numDispatched +=
dispatch(closest, it, router, reservations);
101 available.erase(closest);
105 myHasServableReservations = reservations.size() > 0 && (available.size() < fleet.size() || numPostponed > 0 || numDispatched > 0);
106 #ifdef DEBUG_SERVABLE
107 std::cout <<
SIMTIME <<
" reservations=" << reservations.size() <<
" avail=" << available.size()
108 <<
" fleet=" << fleet.size() <<
" postponed=" << numPostponed <<
" dispatched=" << numDispatched <<
"\n";
115 #ifdef DEBUG_DISPATCH
122 resIt = reservations.erase(resIt);
133 bool havePostponed =
false;
134 int numDispatched = 0;
136 std::set<MSDevice_Taxi*, MSVehicleDevice::ComparatorNumericalVehicleIdLess> available;
137 for (
auto* taxi : fleet) {
138 if (taxi->isEmpty()) {
139 available.insert(taxi);
142 #ifdef DEBUG_DISPATCH
143 std::cout <<
SIMTIME <<
" computeDispatch fleet=" << fleet.size() <<
" available=" << available.size() <<
"\n";
147 std::vector<Reservation*> activeReservations;
149 if (res->recheck <= now) {
150 activeReservations.push_back(res);
153 while (available.size() > 0 && activeReservations.size() > 0) {
159 for (
auto* taxi : available) {
160 if (taxi->getHolder().getVehicleType().getPersonCapacity() < (
int)res->persons.size()) {
164 SUMOTime taxiWait = res->pickupTime - (now + travelTime);
165 #ifdef DEBUG_TRAVELTIME
166 if (
DEBUG_COND2(person)) std::cout <<
SIMTIME <<
" taxi=" << taxi->getHolder().getID() <<
" person=" <<
toString(res->persons)
171 if (travelTime < closestTime) {
173 closestTime = travelTime;
177 recheck =
MIN2(recheck,
189 if (closestTaxi !=
nullptr) {
190 auto closeIt = std::find(activeReservations.begin(), activeReservations.end(), closest);
191 numDispatched +=
dispatch(closestTaxi, closeIt, router, activeReservations);
192 available.erase(closestTaxi);
195 havePostponed =
true;
201 #ifdef DEBUG_SERVABLE
203 <<
" fleet=" << fleet.size() <<
" postponed=" << havePostponed <<
" dispatched=" << numDispatched <<
"\n";
std::string time2string(SUMOTime t)
convert SUMOTime to string
@ SVC_TAXI
vehicle is a taxi
std::string toString(const T &t, std::streamsize accuracy=gPrecision)
A device which collects info on the vehicle trip (mainly on departure and arrival)
void dispatch(const Reservation &res)
service the given reservation
sorts reservations by time
void computeDispatch(SUMOTime now, const std::vector< MSDevice_Taxi * > &fleet)
computes dispatch and updates reservations
const SUMOTime myRecheckTime
recheck interval for early reservations
virtual void computeDispatch(SUMOTime now, const std::vector< MSDevice_Taxi * > &fleet)
computes dispatch and updates reservations
const int myRoutingMode
which router/edge weights to use
virtual int dispatch(MSDevice_Taxi *taxi, std::vector< Reservation * >::iterator &resIt, SUMOAbstractRouter< MSEdge, SUMOVehicle > &router, std::vector< Reservation * > &reservations)
trigger taxi dispatch.
const SUMOTime myRecheckSafety
const SUMOTime myMaximumWaitingTime
maximum time to arrive earlier at customer
static SUMOTime computePickupTime(SUMOTime t, const MSDevice_Taxi *taxi, const Reservation &res, SUMOAbstractRouter< MSEdge, SUMOVehicle > &router)
compute time to pick up the given reservation
bool myHasServableReservations
whether the last call to computeDispatch has left servable reservations
std::vector< Reservation * > getReservations()
retrieve all reservations
void servedReservation(const Reservation *res)
static MSNet * getInstance()
Returns the pointer to the unique instance of MSNet (singleton).
SUMOAbstractRouter< MSEdge, SUMOVehicle > & getRouterTT(const int rngIndex, const MSEdgeVector &prohibited=MSEdgeVector()) const
static SUMOAbstractRouter< MSEdge, SUMOVehicle > & getRouterTT(const int rngIndex, SUMOVehicleClass svc, const MSEdgeVector &prohibited=MSEdgeVector())
return the router instance
SUMOVehicle & getHolder() const
Returns the vehicle that holds this device.
const std::string & getID() const
Returns the id.
std::set< MSTransportable * > persons