private void CheckForCarAtHome(Time StartTime, Time EndTime, HouseholdResourceAllocator resourceAllocator, ModeChoiceTripChainData PassengerTripChainData, int driverIndex, int passengerIndex, int passengerTripChainIndex, Random random, ITashaPerson driver) { int totalVehicles = Household.Vehicles.Length; if (totalVehicles == 0) { return; } int allDrivers = 0; PurePassengerTripChain DriverTripChain; for (int i = 0; i < Household.Persons.Length; i++) { if (Household.Persons[i].Licence) { allDrivers++; } } if (totalVehicles >= allDrivers) { //then there is always a car at home (when a driver is home), so we can add a trip chain to the driver's trip. DriverTripChain = CreateDriverTripChain(StartTime, EndTime, Household.HomeZone, driver); CheckForPurePassengerTrips(DriverTripChain, PassengerTripChainData, driverIndex, passengerIndex, passengerTripChainIndex, random); } else { var TimeSlots = resourceAllocator.VehicleAvailability; for (int i = 0; i < TimeSlots.Count; i++) { if (TimeSlots[i].AvailableCars > 0) { Time intersectionStart, intersectionEnd; if (Time.Intersection(StartTime, EndTime, TimeSlots[i].TimeSpan.Start, TimeSlots[i].TimeSpan.End, out intersectionStart, out intersectionEnd)) { DriverTripChain = CreateDriverTripChain(intersectionStart, intersectionEnd, Household.HomeZone, driver); CheckForPurePassengerTrips(DriverTripChain, PassengerTripChainData, driverIndex, passengerIndex, passengerTripChainIndex, random); } } } } }
public void GeneratePotentialPassengerTrips(Random random, bool pass3 = true, HouseholdResourceAllocator resourceAllocator = null) { // the first step is to clear out all of our potential trips from the last household iteration PotentialTrips.Clear(); if (pass3) { Conflicts.Clear(); } // for each person, for each trip chain for (int i = 0; i < HouseholdData.PersonData.Length; i++) { var personData = HouseholdData.PersonData[i]; for (int j = 0; j < personData.TripChainData.Length; j++) { // if it does not use a vehicle, then we can see if we can become a passenger var tripChainData = personData.TripChainData[j]; if (tripChainData.TripChain.JointTrip && !tripChainData.TripChain.JointTripRep) { continue; } // make sure that it doesn't require a vehicle if (tripChainData.TripChain.Trips[0].Mode.RequiresVehicle == null) { // if we are the representative for the trip (or no one is) if (!tripChainData.TripChain.JointTrip || tripChainData.TripChain.JointTripRep) { if (pass3) { FindPotentialOnTourDriverForPassengerTrips(tripChainData, i, j, random); } else { FindPotentialAtHomeDriverForPassengerTrips(tripChainData, i, j, resourceAllocator, random); } } } } } }
private void FindPotentialAtHomeDriverForPassengerTrips(ModeChoiceTripChainData passengerTripChainData, int passengerNumber, int passengerTripChainIndex, HouseholdResourceAllocator resourceAllocator, Random random) { Time startTime; Time endTime; for (int i = 0; i < HouseholdData.PersonData.Length; i++) { if (passengerNumber == i) { // you can't passenger yourself continue; } if (!Household.Persons[i].Licence) { //The person at home must be a driver continue; } var personData = HouseholdData.PersonData[i]; var numberOfTripChains = personData.TripChainData.Length; //Check if driver is home all day if (numberOfTripChains == 0) { //check car availability and then assign trip chain CheckForCarAtHome(Time.StartOfDay, Time.EndOfDay, resourceAllocator, passengerTripChainData, i, passengerNumber, passengerTripChainIndex, random, Household.Persons[i]); } else { for (int j = 0; j < numberOfTripChains; j++) { var driverTripChainData = personData.TripChainData[j]; if (driverTripChainData.TripChain.JointTrip && !driverTripChainData.TripChain.JointTripRep) { continue; } //Check if it is the last trip chain of the driver's day. if (j >= numberOfTripChains - 1) { // check car availability and then assign startTime = driverTripChainData.TripChain.Trips[driverTripChainData.TripChain.Trips.Count - 1].ActivityStartTime; CheckForCarAtHome(startTime, Time.EndOfDay, resourceAllocator, passengerTripChainData, i, passengerNumber, passengerTripChainIndex, random, Household.Persons[i]); } else { var currentTripChainTrips = personData.TripChainData[j].TripChain.Trips; var nextTripChainTrips = personData.TripChainData[j + 1].TripChain.Trips; //First trip chain of the day if (j == 0) { // that means that you can have them transport a passenger before they leave home. endTime = currentTripChainTrips[0].TripStartTime; CheckForCarAtHome(Time.StartOfDay, endTime, resourceAllocator, passengerTripChainData, i, passengerNumber, passengerTripChainIndex, random, Household.Persons[i]); } if (currentTripChainTrips[currentTripChainTrips.Count - 1].ActivityStartTime < nextTripChainTrips[0].TripStartTime) { //check car availability and then assign trip chain startTime = currentTripChainTrips[currentTripChainTrips.Count - 1].ActivityStartTime; endTime = nextTripChainTrips[0].TripStartTime; CheckForCarAtHome(startTime, endTime, resourceAllocator, passengerTripChainData, i, passengerNumber, passengerTripChainIndex, random, Household.Persons[i]); } } } } } }
public bool Run(ITashaHousehold household) { if (MaxTripChainSize > 0) { if (AnyOverMaxTripChainSize(household)) { return(false); } } Random random = new Random(RandomSeed + household.HouseholdId); ModeChoiceHouseholdData householdData = new ModeChoiceHouseholdData(household, AllModes.Length, VehicleTypes.Length + 1); HouseholdResourceAllocator householdResourceAllocator = new HouseholdResourceAllocator(household, AllModes); PassengerMatchingAlgorithm passengerMatchingAlgorithm = null; // attach this so analysis modules can look at it later household.Attach("ModeChoiceData", householdData); household.Attach("ResourceAllocator", householdResourceAllocator); if (PassengerMode != null) { passengerMatchingAlgorithm = new PassengerMatchingAlgorithm(household, householdData, PassengerMode, AllModes); household.Attach("PassengerMatchingAlgorithm", passengerMatchingAlgorithm); } for (int i = 0; i < PostHouseholdIteration.Length; i++) { PostHouseholdIteration[i].HouseholdStart(household, HouseholdIterations); } if (!Pass1(householdData, random)) { for (int i = 0; i < PostHouseholdIteration.Length; i++) { PostHouseholdIteration[i].HouseholdComplete(household, false); } return(false); } for (int householdIteration = 0; householdIteration < HouseholdIterations; householdIteration++) { if (householdIteration > 0) { RegenerateErrorTerms(householdData, random); } // Start of Pass 2 AssignBestPerVehicle(Root.VehicleTypes, householdData); var resolution = householdResourceAllocator.Resolve(householdData, VehicleTypes, householdIteration); if (resolution == null) { for (int i = 0; i < PostHouseholdIteration.Length; i++) { PostHouseholdIteration[i].HouseholdComplete(household, false); } // failure return(false); } AssignModes(resolution, householdData); householdResourceAllocator.BuildVehicleAvailabilities(householdData, household.Vehicles); // Start of Pass 2.5 ( rideshare ) ProcessRideshare(householdData); // Start of Pass 3 (Passenger attaching to trip chains) if (passengerMatchingAlgorithm != null) { passengerMatchingAlgorithm.GeneratePotentialPassengerTrips(random); passengerMatchingAlgorithm.ResolvePassengerTrips(); // Start of Pass 4 (Passenger attaching to new trips coming from home) passengerMatchingAlgorithm.GeneratePotentialPassengerTrips(random, false, householdResourceAllocator); passengerMatchingAlgorithm.ResolvePassengerTrips(); } // Now at the end add to chosen modes (And assign joint trips) FinalAssignment(householdData, householdIteration); for (int i = 0; i < PostHouseholdIteration.Length; i++) { PostHouseholdIteration[i].HouseholdIterationComplete(household, householdIteration, HouseholdIterations); } } for (int i = 0; i < PostHouseholdIteration.Length; i++) { PostHouseholdIteration[i].HouseholdComplete(household, true); } return(true); }