コード例 #1
0
  private void repareDriverTrips(final JointTrip toRemove, final JointPlan plan) {
    final List<TripStructureUtils.Trip> subtrips =
        getDriverTrip(toRemove, plan.getIndividualPlan(toRemove.getDriverId()));
    final List<PlanElement> newTrip = new ArrayList<PlanElement>();
    newTrip.add(PopulationUtils.createLeg(TransportMode.car));

    // "state" variables, changed in the loop:
    // - keeps track of the passengers currently in the vehicle.
    //   Pick-up or drop-offs are created at each change
    Set<Id> currentPassengers = Collections.<Id>emptySet();
    for (TripStructureUtils.Trip subtrip : subtrips) {
      final Leg leg = getDriverLegIfItIs(subtrip);
      final Route route = leg == null ? null : leg.getRoute();

      final Set<Id> newPassengers =
          route != null
              ? new HashSet<Id>(((DriverRoute) route).getPassengersIds())
              : Collections.<Id>emptySet();
      // note that no check of the mode is done...
      if (!newPassengers.equals(currentPassengers)) {
        newTrip.add(
            PopulationUtils.createActivityFromLinkId(
                JointActingTypes.INTERACTION,
                route != null ? route.getStartLinkId() : subtrip.getOriginActivity().getLinkId()));

        // as the spatial structure of the trip is modified, it is possible
        // that some pre-existing subtours are removed. Thus, a driver that may
        // have walked to a pick up (because at the same location as its departure)
        // may then have to drive to pick up the second passenger directly if
        // the first passenger was removed. Setting all non-driver legs
        // to car ensures to have a consistent mode chain.
        // XXX It could be done in a smarter way, so that if no subtour is removed, no modification
        // is done
        // For instance, when removing an "intern" trip, first PU and last DO are
        // left untouched, and thus access and egress leg need not be touched.
        newTrip.add(leg != null ? leg : PopulationUtils.createLeg(TransportMode.car));
        currentPassengers = newPassengers;
      }
    }

    TripRouter.insertTrip(
        plan.getIndividualPlan(toRemove.getDriverId()),
        subtrips.get(0).getOriginActivity(),
        newTrip,
        subtrips.get(subtrips.size() - 1).getDestinationActivity());
  }
コード例 #2
0
  private static List<JointTrip> getChoiceSet(
      final JointTravelStructure structure, final Collection<Id<Person>> agentsToIgnore) {
    if (agentsToIgnore.isEmpty()) return structure.getJointTrips();

    final List<JointTrip> choiceSet = new ArrayList<JointTrip>();

    for (JointTrip t : structure.getJointTrips()) {
      if (agentsToIgnore.contains(t.getDriverId())) continue;
      if (agentsToIgnore.contains(t.getPassengerId())) continue;
      choiceSet.add(t);
    }

    return choiceSet;
  }
コード例 #3
0
  public ActedUponInformation run(
      final JointPlan plan, final Collection<Id<Person>> agentsToIgnore) {
    final JointTravelStructure structure = JointTravelUtils.analyseJointTravel(plan);

    if (structure.getJointTrips().size() == 0) {
      log.warn(
          getClass().getSimpleName()
              + " was called on a plan with no joint trips."
              + " Make sure it is what you want!");
      return null;
    }

    final List<JointTrip> choiceSet = getChoiceSet(structure, agentsToIgnore);
    if (choiceSet.isEmpty()) return null;

    final JointTrip toRemove = choiceSet.get(random.nextInt(choiceSet.size()));

    removePassengerTrip(toRemove, plan);
    removeDriverTrip(toRemove, plan);
    return new ActedUponInformation(toRemove.getDriverId(), toRemove.getPassengerId());
  }