private double calculateFirstAgentStartTime() { double firstAgentStartTime = Double.POSITIVE_INFINITY; for (MobsimAgent agent : agents.values()) { firstAgentStartTime = Math.min(firstAgentStartTime, agent.getActivityEndTime()); } return firstAgentStartTime; }
@Override public int compare(MobsimAgent mobsimAgent, MobsimAgent mobsimAgent1) { return Double.compare(mobsimAgent.getActivityEndTime(), mobsimAgent1.getActivityEndTime()); } });
private void replanCurrentTripFromStageActivity(final List<PlanElement> tripElements, int tripElementsIndex, MobsimAgent agent, String mainMode) { // String mainMode = tripRouter.getMainModeIdentifier().identifyMainMode(tripElements) ; // yyyy I wonder what this will do if we are already at the egress stage. kai, oct'17 List<PlanElement> subTripPlanElements = tripElements.subList(tripElementsIndex,tripElements.size()-1) ; Trip subTrip = TripStructureUtils.getTrips(subTripPlanElements, tripRouter.getStageActivityTypes()).get(0) ; final double dpTime = agent.getActivityEndTime() ; this.replanFutureTrip(subTrip, WithinDayAgentUtils.getModifiablePlan(agent), mainMode, dpTime ) ; } // future:
@Override public void notifyMobsimAfterSimStep(MobsimAfterSimStepEvent e) { double now = e.getSimulationTime(); for (MobsimAgent mobsimAgent : startingAgents.values()) { double departureTime = mobsimAgent.getActivityEndTime(); /* * If it is the last scheduled Activity the departureTime is -infinity. * Otherwise we select the agent for a replanning. */ if (departureTime >= now) { this.activityEndTimes.put(mobsimAgent.getId(), departureTime); int bin = this.getTimeBin(mobsimAgent.getActivityEndTime()); Map<Id<Person>, MobsimAgent> map = getMapForTimeBin(bin); map.put(mobsimAgent.getId(), mobsimAgent); } else { log.warn("Departure time is in the past - ignoring activity!"); } } this.startingAgents.clear(); /* * Remove current time bin from activityPerformingAgents map. They have been handled * in the current time step. */ this.activityPerformingAgents.remove(this.getTimeBin(now)); }
@Override public void handleEvent(ReplanningEvent event) { // check whether the agent is performing an activity Double activityEndTime = this.activityEndTimes.get(event.getPersonId()); if (activityEndTime != null) { // check whether the agent has changed its planned departure time MobsimAgent agent = this.mobsimDataProvider.getAgent(event.getPersonId()); if (activityEndTime != agent.getActivityEndTime()) { // Update the agent's activity end time. this.activityEndTimes.put(agent.getId(), agent.getActivityEndTime()); // Update the activity performing agents map. To do so, remove old entry and add new one. Map<Id<Person>, MobsimAgent> map; // remove map = this.getMapForTimeBin(this.getTimeBin(activityEndTime)); map.remove(agent.getId()); // add map = this.getMapForTimeBin(this.getTimeBin(agent.getActivityEndTime())); map.put(agent.getId(), agent); } } }
@Override public void notifyMobsimInitialized(MobsimInitializedEvent e) { MobsimTimer mobsimTimer = ((QSim) e.getQueueSimulation()).getSimTimer(); this.simStartTime = mobsimTimer.getSimStartTime(); this.timeStepSize = mobsimTimer.getSimTimestepSize(); this.activityPerformingAgents.clear(); for (MobsimAgent mobsimAgent : this.mobsimDataProvider.getAgents().values()) { // get the agent's activity end time and mark it as currently performing an Activity double activityEndTime = mobsimAgent.getActivityEndTime(); // add the agent to the collections this.activityEndTimes.put(mobsimAgent.getId(), activityEndTime); int bin = this.getTimeBin(activityEndTime); Map<Id<Person>, MobsimAgent> map = getMapForTimeBin(bin); map.put(mobsimAgent.getId(), mobsimAgent); } }
if (agent.getActivityEndTime() == Double.POSITIVE_INFINITY) { } else if (agent.getActivityEndTime() <= internalInterface.getMobsim().getSimTimer().getTimeOfDay() && !beforeFirstSimStep) { } else { final AgentEntry agentEntry = new AgentEntry(agent, agent.getActivityEndTime()); activityEndsList.add(agentEntry); internalInterface.registerAdditionalAgentOnLink(agent);
@Override public boolean handleActivity(MobsimAgent agent) { if (!(agent instanceof DynAgent)) { return activityEngine.handleActivity(agent); } double endTime = agent.getActivityEndTime(); double currentTime = internalInterface.getMobsim().getSimTimer().getTimeOfDay(); if (endTime == Double.POSITIVE_INFINITY) { // This is the last planned activity. // So the agent goes to sleep. internalInterface.getMobsim().getAgentCounter().decLiving(); } else if (endTime <= currentTime && !beforeFirstSimStep) { // This activity is already over (planned for 0 duration) // So we proceed immediately. agent.endActivityAndComputeNextState(currentTime); internalInterface.arrangeNextAgentState(agent); } else { // The agent commences an activity on this link. if (beforeFirstSimStep) { dynAgents.add((DynAgent)agent); } else { newDynAgents.add((DynAgent)agent); } internalInterface.registerAdditionalAgentOnLink(agent); } return true; }
double newActivityEndTime = agent.getActivityEndTime(); AgentEntry oldEntry = removeAgentFromQueue(agent);
assertEquals(5, agents.size()); assertTrue(agents.get(0) instanceof TransitDriverAgent); assertEquals(6.0*3600, agents.get(0).getActivityEndTime(), MatsimTestCase.EPSILON); assertEquals(7.0*3600, agents.get(1).getActivityEndTime(), MatsimTestCase.EPSILON); assertEquals(8.0*3600, agents.get(2).getActivityEndTime(), MatsimTestCase.EPSILON); assertEquals(8.5*3600, agents.get(3).getActivityEndTime(), MatsimTestCase.EPSILON); assertEquals(9.0*3600, agents.get(4).getActivityEndTime(), MatsimTestCase.EPSILON);