public final boolean replanCurrentTrip(MobsimAgent agent, double now, String routingMode ) { log.debug("entering replanCurrentTrip with routingMode=" + routingMode) ; // I will treat that in the way that it will make the trip consistent with the activities. So if the activity in the // plan has changed, the trip will go to a new location. // what matters is the external interface, which is the method call. Everything below is internal so it does not matter so much. Trip trip = findCurrentTrip( agent ) ; final PlanElement currentPlanElement = WithinDayAgentUtils.getCurrentPlanElement(agent) ; final List<PlanElement> tripElements = trip.getTripElements(); int tripElementsIndex = tripElements.indexOf( currentPlanElement ) ; // final String currentMode = tripRouter.getMainModeIdentifier().identifyMainMode( tripElements ) ; if ( currentPlanElement instanceof Activity ) { // we are on a stage activity. Take it from there: replanCurrentTripFromStageActivity(tripElements, tripElementsIndex, agent, routingMode); } else { // we are on a leg replanCurrentTripFromLeg(trip.getDestinationActivity(), currentPlanElement, routingMode, now, agent); } WithinDayAgentUtils.resetCaches(agent); return true ; } private void replanCurrentTripFromLeg(Activity newAct, final PlanElement currentPlanElement, final String routingMode,
public final Trip findCurrentTrip( MobsimAgent agent ) { PlanElement pe = WithinDayAgentUtils.getCurrentPlanElement(agent) ; return findTripAtPlanElement(agent, pe); } public Trip findTripAtPlanElement(MobsimAgent agent, PlanElement pe) {
public final boolean insertEmptyTrip( Plan plan, Activity fromActivity, Activity toActivity, String mainMode ) { return insertEmptyTrip( plan, fromActivity, toActivity, mainMode, this.pf ) ; } /**
private void replanCurrentLegWithNetworkRoute(Activity newAct, String mainMode, Leg currentLeg, double now, MobsimAgent agent) { log.debug("entering replanCurrentLegWithNetworkRoute") ; Plan plan = WithinDayAgentUtils.getModifiablePlan(agent) ; List<PlanElement> planElements = plan.getPlanElements() ; Person person = plan.getPerson() ; // (1) get new trip from current position to new activity: List<? extends PlanElement> newTripElements = newTripToNewActivity(newAct, mainMode, now, agent, person, scenario); // (2) prune the new trip up to the current leg: pruneUpToCurrentLeg(currentLeg, newTripElements); // (2) modify current route: replaceRemainderOfCurrentRoute(currentLeg, newTripElements, agent); // (3) remove remainder of old trip after current leg in plan: int pos = WithinDayAgentUtils.getCurrentPlanElementIndex(agent) + 1 ; while ( !planElements.get(pos).equals(newAct) ) { planElements.remove(pos) ; } // (4) insert new trip after current leg: for ( int ijk = 1 ; ijk < newTripElements.size() ; ijk++ ) { planElements.add( pos, newTripElements.get(ijk) ) ; } WithinDayAgentUtils.resetCaches(agent); } private List<? extends PlanElement> newTripToNewActivity(Activity newAct, String mainMode, double now,
public void insertActivity(MobsimAgent agent, int index, Activity activity, String upstreamMode, String downstreamMode ) { Plan plan = WithinDayAgentUtils.getModifiablePlan(agent) ; List<PlanElement> planElements = plan.getPlanElements() ; checkIfNotInPastOrCurrent(agent, index) ; planElements.add( index, activity ) ; { // activity before: Activity actBefore = findRealActBefore(agent, index); if ( actBefore != null ) { if ( WithinDayAgentUtils.indexOfPlanElement(agent, actBefore) < WithinDayAgentUtils.getCurrentPlanElementIndex(agent) ) { // we are already under way editTrips.replanCurrentTrip(agent, this.mobsim.getSimTimer().getTimeOfDay(), upstreamMode ); } else { // we are not yet under way; inserting empty trip: EditTrips.insertEmptyTrip(plan, actBefore, activity, upstreamMode, pf ) ; } } } { // activity after: Activity actAfter = findRealActAfter(agent, index); if ( actAfter != null ) { EditTrips.insertEmptyTrip(plan, activity, actAfter, downstreamMode, pf ) ; } } WithinDayAgentUtils.resetCaches(agent); this.mobsim.rescheduleActivityEnd(agent); }
public boolean addActivityAtEnd(MobsimAgent agent, Activity activity, String routingMode) { log.debug("entering addActivityAtEnd with routingMode=" + routingMode) ; Plan plan = WithinDayAgentUtils.getModifiablePlan(agent); List<PlanElement> planElements = plan.getPlanElements(); boolean retVal1 = false; if (isAtRealActivity(agent)) { retVal1 = planElements.add(pf.createLeg(routingMode)); } final boolean retVal = planElements.add(activity); // (need the terminating activity in order to find the current trip. kai, nov'17) if (!isAtRealActivity(agent)) { retVal1 = editTrips.replanCurrentTrip(agent,mobsim.getSimTimer().getTimeOfDay(),routingMode); } WithinDayAgentUtils.resetCaches(agent); this.mobsim.rescheduleActivityEnd(agent); return (retVal1 && retVal); } public PlanElement removeActivity(MobsimAgent agent, int index, String mode) {
@Override public boolean doReplanning(MobsimAgent withinDayAgent) { Plan executedPlan = WithinDayAgentUtils.getModifiablePlan(withinDayAgent); // If we don't have an executed plan if (executedPlan == null) return false; // Get the activity currently performed by the agent as well as the subsequent trip. Activity currentActivity = (Activity) WithinDayAgentUtils.getCurrentPlanElement(withinDayAgent); Trip trip = TripStructureUtils.findTripStartingAtActivity(currentActivity, executedPlan, this.tripRouter.getStageActivityTypes() ); // If there is no trip after the activity. if (trip == null) return false; String mainMode = this.tripRouter.getMainModeIdentifier().identifyMainMode(trip.getTripElements()); double departureTime = TripStructureUtils.getDepartureTime(trip); new EditTrips(this.tripRouter, scenario).replanFutureTrip(trip, executedPlan, mainMode, departureTime); return true; }
public String getModeOfCurrentOrNextTrip(MobsimAgent agent) { Trip trip ; if ( isAtRealActivity( agent ) ) { Activity activity = (Activity) WithinDayAgentUtils.getCurrentPlanElement(agent) ; trip = editTrips.findTripAfterActivity(WithinDayAgentUtils.getModifiablePlan(agent), activity) ; } else { trip = editTrips.findCurrentTrip(agent) ; } return tripRouter.getMainModeIdentifier().identifyMainMode(trip.getTripElements()) ; } public void flushEverythingBeyondCurrent(MobsimAgent agent) {
@Inject Replanner(QSim qSim2, TripRouter tripRouter, Map<String,TravelTime> travelTimes ) { Scenario scenario = qSim2.getScenario(); this.travelTimes = travelTimes ; { TravelTime travelTime = TravelTimeUtils.createFreeSpeedTravelTime(); TravelDisutility travelDisutility = TravelDisutilityUtils.createFreespeedTravelTimeAndDisutility(scenario.getConfig().planCalcScore()); LeastCostPathCalculator pathCalculator = new FastAStarLandmarksFactory().createPathCalculator(scenario.getNetwork(), travelDisutility, travelTime); this.editRoutes = new EditRoutes(scenario.getNetwork(), pathCalculator, scenario.getPopulation().getFactory()); } this.editTrips = new EditTrips(tripRouter, qSim2.getScenario() ) ; this.editPlans = new EditPlans(qSim2, tripRouter, editTrips, scenario.getPopulation().getFactory() ) ; }
private void replanCurrentTripFromLeg(Activity newAct, final PlanElement currentPlanElement, final String routingMode, double now, MobsimAgent agent) { log.debug("entering replanCurrentTripFromLeg"); Leg currentLeg = (Leg) currentPlanElement ; if ( currentLeg.getRoute() instanceof NetworkRoute ) { replanCurrentLegWithNetworkRoute(newAct, routingMode, currentLeg, now, agent); } else { throw new ReplanningException("not implemented") ; // Does not feel so hard: // * with teleported legs, push forward to next facility // * with passenger legs, push forward to next possibility of exit } WithinDayAgentUtils.resetCaches(agent); } private void replanCurrentLegWithNetworkRoute(Activity newAct, String mainMode, Leg currentLeg, double now,
/** * Convenience method, clarifying that this can be called without giving the mode. */ public void insertActivity(MobsimAgent agent, int index, Activity activity ) { String mode = tripRouter.getMainModeIdentifier().identifyMainMode( editTrips.findCurrentTrip(agent).getTripElements() ) ; insertActivity( agent, index, activity, mode, mode ) ; }
this.editTrips.replanCurrentTrip(agent, this.mobsim.getSimTimer().getTimeOfDay(), currentMode ); } else { upstreamMode = currentMode ; this.editTrips.insertEmptyTrip( plan, tripBeforeAct.getOriginActivity(), newAct, upstreamMode ); EditTrips.insertEmptyTrip(plan, newAct, tripAfterAct.getDestinationActivity(), currentMainMode, pf); } else { EditTrips.insertEmptyTrip(plan, newAct, tripAfterAct.getDestinationActivity(), downstreamMode, pf);
@Override public boolean handle(String agentID, String actionID, Object[] args) { // assertions: MobsimAgent mobsimAgent = model.getMobsimAgentFromIdString(agentID) ; Gbl.assertNotNull(mobsimAgent) ; Gbl.assertIf( args.length >= 1 ); Gbl.assertIf( args[0] instanceof MATSimModel.RoutingMode) ; // could have some default MATSimModel.RoutingMode routingMode = (MATSimModel.RoutingMode)args[0]; if (WithinDayAgentUtils.isOnReplannableCarLeg(mobsimAgent)) { model.getReplanner().editTrips().replanCurrentTrip(mobsimAgent, 0.0, routingMode.name()); } return true; } }
public PlanElement removeActivity(MobsimAgent agent, int index, String mode) { Plan plan = WithinDayAgentUtils.getModifiablePlan(agent) ; List<PlanElement> planElements = plan.getPlanElements() ; checkIfNotInPastOrCurrent(agent, index); final Trip tripBefore = TripStructureUtils.findTripEndingAtActivity( (Activity) planElements.get(index),plan,tripRouter.getStageActivityTypes() ); final Trip tripAfter = TripStructureUtils.findTripStartingAtActivity( (Activity)planElements.get(index),plan,tripRouter.getStageActivityTypes() ); if ( mode==null ) { final String mainModeBefore = tripRouter.getMainModeIdentifier().identifyMainMode( tripBefore.getTripElements() ); final String mainModeAfter = tripRouter.getMainModeIdentifier().identifyMainMode( tripAfter.getTripElements() ); if ( mainModeBefore.equals( mainModeAfter ) ) { mode = mainModeBefore ; } else { throw new ReplanningException("mode not given and mode before removed activity != mode after removed activity; don't know which mode to use") ; } } PlanElement pe = planElements.remove(index) ; if ( checkIfTripHasAlreadyStarted( agent, tripBefore.getTripElements() ) ) { editTrips.replanCurrentTrip(agent, mobsim.getSimTimer().getTimeOfDay() , mode); } else { editTrips.insertEmptyTrip(plan, tripBefore.getOriginActivity(), tripAfter.getDestinationActivity(), mode ) ; } WithinDayAgentUtils.resetCaches(agent); this.mobsim.rescheduleActivityEnd(agent); return pe ; } public final void rescheduleActivityEndtime( MobsimAgent agent, int index, double newEndTime ) {
model.getReplanner().editTrips().replanCurrentTrip( agent, now, routingMode );
public Trip findTripAtPlanElementIndex( MobsimAgent agent, int index ) { return findTripAtPlanElement( agent, WithinDayAgentUtils.getModifiablePlan(agent).getPlanElements().get(index) ) ; } // current trip: