private void moveBufferToNextLane(QLaneI qlane) { QVehicle veh; while (!qlane.isNotOfferingVehicle()) { veh = qlane.getFirstVehicle(); Id<Link> toLinkId = veh.getDriver().chooseNextLinkId(); QLaneI nextQueue = this.chooseNextLane(qlane, toLinkId); if (nextQueue != null) { if (nextQueue.isAcceptingFromUpstream()) { qlane.popFirstVehicle(); nextQueue.addFromUpstream(veh); } else { break; } } else { StringBuilder b = new StringBuilder(); b.append("Person Id: ").append(veh.getDriver().getId()); b.append(" is on Lane Id ").append(qlane.getId()); b.append(" on Link Id ").append(this.getLink().getId()); b.append(" and wants to drive to Link Id ").append(toLinkId); b.append(" but there is no Lane leading to that Link!"); log.error(b.toString()); throw new IllegalStateException(b.toString()); } } }
/** * This method returns the normalized capacity of the link, i.e. the capacity of vehicles per * second. It is considering the capacity reduction factors set in the config and the * simulation's tick time. * * @return the flow capacity of this link per second, scaled by the config values and in * relation to the SimulationTimer's simticktime. */ double getSimulatedFlowCapacity() { return this.firstLaneQueue.getSimulatedFlowCapacityPerTimeStep(); }
/** * @return the total space capacity available on that link (includes the space on lanes if available) */ double getSpaceCap() { return this.qlane.getStorageCapacity(); }
private QLaneI chooseNextLane(QLaneI queue, Id<Link> toLinkId) { List<QLaneI> toQueues = this.nextQueueToLinkCache.get(queue.getId()).get(toLinkId); QLaneI retLane = toQueues.get(0); if (toQueues.size() == 1) { return retLane; } // else chose lane by storage cap for (int i = 1; i < toQueues.size(); i++) { QLaneI toQueue = toQueues.get(i); if (toQueue.getLoadIndicator() < retLane.getLoadIndicator()) { retLane = toQueue; } } return retLane; }
private void moveLink(final QLinkI link, final double now){ for (QLaneI lane : link.getOfferingQLanes()) { while (! lane.isNotOfferingVehicle()) { QVehicle veh = lane.getFirstVehicle(); if (! moveVehicleOverNode(veh, link, lane, now )) { break; } } } }
private void moveVehicleFromInlinkToOutlink(final QVehicle veh, Id<Link> currentLinkId, final QLaneI fromLane, Id<Link> nextLinkId, QLaneI nextQueueLane) { double now = this.context.getSimTimer().getTimeOfDay() ; fromLane.popFirstVehicle(); // --> // network.simEngine.getMobsim().getEventsManager().processEvent(new LaneLeaveEvent(now, veh.getId(), currentLinkId, fromLane.getId())); this.context.getEventsManager().processEvent(new LinkLeaveEvent(now, veh.getId(), currentLinkId)); // <-- veh.getDriver().notifyMoveOverNode( nextLinkId ); // --> this.context.getEventsManager().processEvent(new LinkEnterEvent(now, veh.getId(), nextLinkId )); // <-- nextQueueLane.addFromUpstream(veh); }
f.qlink2.getAcceptingQLane().addFromUpstream(veh5); // used vehicle equivalents: 5 assertTrue(f.qlink2.getAcceptingQLane().isAcceptingFromUpstream()); f.qlink2.getAcceptingQLane().addFromUpstream(veh5); // used vehicle equivalents: 10 assertFalse(f.qlink2.getAcceptingQLane().isAcceptingFromUpstream()); assertTrue(f.qlink2.isNotOfferingVehicle()); assertTrue(f.qlink2.getAcceptingQLane().isAcceptingFromUpstream()); assertFalse(f.qlink2.isNotOfferingVehicle()); f.qlink2.getOfferingQLanes().get(0).popFirstVehicle(); // first veh leaves buffer assertTrue(f.qlink2.getAcceptingQLane().isAcceptingFromUpstream()); f.qlink2.getAcceptingQLane().addFromUpstream(veh25); // used vehicle equivalents: 7.5 f.qlink2.getAcceptingQLane().addFromUpstream(veh1); // used vehicle equivalents: 8.5 f.qlink2.getAcceptingQLane().addFromUpstream(veh1); // used vehicle equivalents: 9.5 assertTrue(f.qlink2.getAcceptingQLane().isAcceptingFromUpstream()); f.qlink2.getAcceptingQLane().addFromUpstream(veh1); // used vehicle equivalents: 10.5 assertFalse(f.qlink2.getAcceptingQLane().isAcceptingFromUpstream()); f.sim.getSimTimer().setTime(now); f.qlink2.doSimStep(); assertFalse(f.qlink2.getAcceptingQLane().isAcceptingFromUpstream()); assertTrue(f.qlink2.getAcceptingQLane().isAcceptingFromUpstream()); f.qlink2.getAcceptingQLane().addFromUpstream(veh1); // used vehicle equivalents: 6.5 f.qlink2.getAcceptingQLane().addFromUpstream(veh25); // used vehicle equivalents: 9.0 f.qlink2.getAcceptingQLane().addFromUpstream(veh1); // used vehicle equivalents: 10.0 assertFalse(f.qlink2.getAcceptingQLane().isAcceptingFromUpstream());
assertNotNull(qlane); assertEquals(0.5, qlane.getSimulatedFlowCapacityPerTimeStep()); assertEquals(240.0, qlane.getStorageCapacity()); totalStorageCapacity += qlane.getStorageCapacity(); for (QLaneI qll : ql.getOfferingQLanes()) { if (((QueueWithBuffer)qll).getId().equals(Id.create(2, Lane.class))) { assertEquals(0.5, qll.getSimulatedFlowCapacityPerTimeStep()); assertEquals(28.0, qll.getStorageCapacity()); assertEquals(0.25, qll.getSimulatedFlowCapacityPerTimeStep()); assertEquals(14.0, qll.getStorageCapacity()); totalStorageCapacity += qll.getStorageCapacity(); totalFlowCapacity += qll.getSimulatedFlowCapacityPerTimeStep();
@Test public void testAdd() { Fixture f = new Fixture(isUsingFastCapacityUpdate); assertEquals(0, ((QueueWithBuffer) f.qlink1.getAcceptingQLane()).getAllVehicles().size()); QVehicle v = new QVehicleImpl(f.basicVehicle); Person p = PopulationUtils.getFactory().createPerson(Id.create("1", Person.class)); p.addPlan(PopulationUtils.createPlan()); v.setDriver(createAndInsertPersonDriverAgentImpl(p, f.sim)); f.qlink1.getAcceptingQLane().addFromUpstream(v); assertEquals(1, ((QueueWithBuffer) f.qlink1.getAcceptingQLane()).getAllVehicles().size()); assertFalse(f.qlink1.getAcceptingQLane().isAcceptingFromUpstream()); assertTrue(f.qlink1.isNotOfferingVehicle()); }
Lane rightOfWayLane = lanes.getLanesToLinkAssignments().get(rightOfWayDir.getFromLink()).getLanes().get(rightOfWayQLane.getId()); if (!rightOfWayLane.getToLinkIds().contains(rightOfWayDir.getToLink())) { QVehicle firstVehOnLink = rightOfWayQLane.getFirstVehicle();
public boolean isAcceptingFromUpstream() { return this.ql.getAcceptingQLane().isAcceptingFromUpstream(); }
/** * Move as many waiting cars to the link as it is possible */ private void moveWaitToRoad() { while (!getWaitingList().isEmpty()) { if (!qlane.isAcceptingFromWait(this.getWaitingList().peek())) { return; } QVehicle veh = this.getWaitingList().poll(); double now = context.getSimTimer().getTimeOfDay() ; context.getEventsManager().processEvent( new VehicleEntersTrafficEvent(now, veh.getDriver().getId(), this.getLink().getId(), veh.getId(), veh.getDriver().getMode(), 1.0)); if ( this.getTransitQLink().addTransitToStopQueue(now, veh, this.getLink().getId()) ) { continue ; } if ( veh.getDriver().isWantingToArriveOnCurrentLink() ) { // If the driver wants to stop (again) on this link, give them a special treatment. // addFromWait doesn't work here, because after that, they cannot stop anymore. qlane.addTransitSlightlyUpstreamOfStop(veh) ; continue; } qlane.addFromWait(veh); } }
public void addFromUpstream(QVehicle veh) { this.ql.getAcceptingQLane().addFromUpstream(veh); } }
@Override public Collection<AgentSnapshotInfo> addAgentSnapshotInfo( final Collection<AgentSnapshotInfo> positions) { double now = context.getSimTimer().getTimeOfDay() ; if (visLink != null) { for (QLaneI ql : QLinkLanesImpl.this.laneQueues.values()) { VisLane otfLane = visLink.getLaneData().get( ql.getId().toString()); ((QueueWithBuffer.VisDataImpl) ql.getVisData()).setVisInfo( otfLane.getStartCoord(), otfLane.getEndCoord()); } } for (QLaneI road : QLinkLanesImpl.this.getQueueLanes().values()) { road.getVisData().addAgentSnapshotInfo(positions, now); } int cnt2 = 10; // treat vehicles from transit stops cnt2 = context.snapshotInfoBuilder.positionVehiclesFromTransitStop(positions, getLink(), getTransitQLink().getTransitVehicleStopQueue(), cnt2); // treat vehicles from waiting list: context.snapshotInfoBuilder.positionVehiclesFromWaitingList(positions, QLinkLanesImpl.this.getLink(), cnt2, QLinkLanesImpl.this.getWaitingList()); cnt2 = QLinkLanesImpl.this.getWaitingList().size(); context.snapshotInfoBuilder.positionAgentsInActivities(positions, QLinkLanesImpl.this.getLink(), QLinkLanesImpl.this.getAdditionalAgentsOnLink(), cnt2); return positions; } }
private void moveVehicleFromInlinkToAbort(final QVehicle veh, final QLaneI fromLane, final double now, Id<Link> currentLinkId) { fromLane.popFirstVehicle(); // --> this.context.getEventsManager().processEvent(new LinkLeaveEvent(now, veh.getId(), currentLinkId)); // <-- // first treat the passengers: for ( PassengerAgent pp : veh.getPassengers() ) { if ( pp instanceof MobsimAgent ) { ((MobsimAgent)pp).setStateToAbort(now); netsimEngine.arrangeNextAgentState((MobsimAgent)pp) ; } else if ( wrnCnt < 1 ) { wrnCnt++ ; log.warn("encountering PassengerAgent that cannot be cast into a MobsimAgent; cannot say if this is a problem" ) ; log.warn(Gbl.ONLYONCE) ; } } // now treat the driver: veh.getDriver().setStateToAbort(now) ; netsimEngine.arrangeNextAgentState(veh.getDriver()) ; }
} else { // lane is within the link and has no connection to a node Map<Id<Link>, List<QLaneI>> toLinkIdDownstreamQueues = new LinkedHashMap<>(); nextQueueToLinkCache.put(Id.create(queue.getId(), Lane.class), toLinkIdDownstreamQueues); for (ModelLane toLane : lane.getToLanes()) { this.laneQueues.put(queue.getId(), queue);
/** * This method moves transit vehicles from the stop queue directly to the front of the * "queue" of the QLink. An advantage is that this will observe flow * capacity restrictions. */ void handleTransitVehiclesInStopQueue(final double now) { QVehicle veh; // handle transit traffic in stop queue List<QVehicle> departingTransitVehicles = null; while ((veh = transitVehicleStopQueue.peek()) != null) { // there is a transit vehicle. if (veh.getEarliestLinkExitTime() > now) { break; } if (departingTransitVehicles == null) { departingTransitVehicles = new LinkedList<>(); } departingTransitVehicles.add(transitVehicleStopQueue.poll()); } if (departingTransitVehicles != null) { // add all departing transit vehicles at the front of the vehQueue ListIterator<QVehicle> iter = departingTransitVehicles.listIterator(departingTransitVehicles.size()); while (iter.hasPrevious()) { this.road.addTransitSlightlyUpstreamOfStop(iter.previous()) ; } } }
f.qlink1.getAcceptingQLane().addFromUpstream(veh); assertTrue(f.qlink1.isNotOfferingVehicle()); assertEquals(1, ((QueueWithBuffer) f.qlink1.getAcceptingQLane()).getAllVehicles().size()); assertEquals(veh, f.qlink1.getOfferingQLanes().get(0).popFirstVehicle()); assertTrue(f.qlink1.isNotOfferingVehicle());
assertNotNull(qlane); assertEquals(0.5, qlane.getSimulatedFlowCapacityPerTimeStep()); assertEquals(240.0, qlane.getStorageCapacity()); qlane = ql.getOfferingQLanes().get(0); assertEquals(0.25, qlane.getSimulatedFlowCapacityPerTimeStep()); assertEquals(14.0, qlane.getStorageCapacity());
if (nextQueueLane.isAcceptingFromUpstream()) { moveVehicleFromInlinkToOutlink(veh, currentLink.getId(), fromLane, nextLinkId, nextQueueLane); return true;