예제 #1
0
        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);
                        }
                    }
                }
            }
        }
예제 #2
0
 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);
                     }
                 }
             }
         }
     }
 }
예제 #3
0
        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]);
                            }
                        }
                    }
                }
            }
        }
예제 #4
0
        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);
        }