public void dropOffPassenger(MobsimDriverAgent driver, PassengerRequest request, double now) { MobsimPassengerAgent passenger = passengersByRequestId.remove(request.getId()); MobsimVehicle mobVehicle = driver.getVehicle(); mobVehicle.removePassenger(passenger); passenger.setVehicle(null); eventsManager.processEvent(new PersonLeavesVehicleEvent(now, passenger.getId(), mobVehicle.getId())); passenger.notifyArrivalOnLinkByNonNetworkMode(passenger.getDestinationLinkId()); passenger.endLegAndComputeNextState(now); internalInterface.arrangeNextAgentState(passenger); } }
public boolean pickUpPassenger(PassengerPickupActivity pickupActivity, MobsimDriverAgent driver, PassengerRequest request, double now) { Id<Link> linkId = driver.getCurrentLinkId(); MobsimPassengerAgent passenger = passengersByRequestId.get(request.getId()); if (passenger.getCurrentLinkId() != linkId || passenger.getState() != State.LEG || !passenger.getMode() .equals(mode)) { awaitingPickupStorage.storeAwaitingPickup(request, pickupActivity); return false;// wait for the passenger } if (internalInterface.unregisterAdditionalAgentOnLink(passenger.getId(), driver.getCurrentLinkId()) == null) { // the passenger has already been picked up and is on another taxi trip // seems there have been at least 2 requests made by this passenger for this location awaitingPickupStorage.storeAwaitingPickup(request, pickupActivity); return false;// wait for the passenger (optimistically, he/she should appear soon) } MobsimVehicle mobVehicle = driver.getVehicle(); mobVehicle.addPassenger(passenger); passenger.setVehicle(mobVehicle); eventsManager.processEvent(new PersonEntersVehicleEvent(now, passenger.getId(), mobVehicle.getId())); return true; }
@Override public OneTaxiRequest createRequest(Id<Request> id, MobsimPassengerAgent passenger, Link fromLink, Link toLink, double departureTime, double submissionTime) { return new OneTaxiRequest(id, passenger.getId(), TransportMode.taxi, fromLink, toLink, departureTime, submissionTime); } }
@Override public boolean handleDeparture(double now, MobsimAgent agent, Id<Link> fromLinkId) { if (!agent.getMode().equals(mode)) { return false; } MobsimPassengerAgent passenger = (MobsimPassengerAgent)agent; Id<Link> toLinkId = passenger.getDestinationLinkId(); double departureTime = now; internalInterface.registerAdditionalAgentOnLink(passenger); PassengerRequest prebookedRequest = advanceRequestStorage.retrieveAdvanceRequest(passenger, fromLinkId, toLinkId, now); if (prebookedRequest == null) {// this is an immediate request //TODO what if it was already rejected while prebooking?? createValidateAndSubmitRequest(passenger, fromLinkId, toLinkId, departureTime, now); } else { passengersByRequestId.put(prebookedRequest.getId(), passenger); PassengerPickupActivity awaitingPickup = awaitingPickupStorage.retrieveAwaitingPickup(prebookedRequest); if (awaitingPickup != null) { awaitingPickup.notifyPassengerIsReadyForDeparture(passenger, now); } } // always mark the departure as handled, even if rejected, in order to get more consistency with rejections // that are decided later (for instance, during optimisation which is usually called in the next sim step) // michalm, sep'18 // See: github.com/matsim-org/matsim/pull/362 for some more discussion return true;//!request.isRejected(); }
@Override public void notifyPassengerIsReadyForDeparture(MobsimPassengerAgent passenger, double now) { PassengerRequest request = getRequestForPassenger(passenger.getId()); if (passengerEngine.pickUpPassenger(this, driver, request, now)) { passengersPickedUp++; } else { throw new IllegalStateException("The passenger is not on the link or not available for departure!"); } }
@Override public void notifyPassengerIsReadyForDeparture(MobsimPassengerAgent passenger, double now) { if (now < expectedEndTime) { return;// pick up only at the end of stop activity } PassengerRequest request = getRequestForPassenger(passenger.getId()); if (passengerEngine.pickUpPassenger(this, driver, request, now)) { passengersPickedUp++; } else { throw new IllegalStateException("The passenger is not on the link or not available for departure!"); } }
@Override public void notifyPassengerIsReadyForDeparture(MobsimPassengerAgent passenger, double now) { if (passenger.getId().equals(request.getPassengerId())) { throw new IllegalArgumentException("I am waiting for a different passenger!"); } passengerAboard = passengerEngine.pickUpPassenger(this, driver, request, now); if (!passengerAboard) { throw new IllegalStateException("The passenger is not on the link or not available for departure!"); } } }