private static bool GenerateJointMarketEpisodes(this ITashaHousehold household, Random random, GenerationAdjustment[] generationAdjustment) { var householdPD = household.HomeZone.PlanningDistrict; // initialize available adults var availableAdults = new List <ITashaPerson>(household.Persons.Length); // We can only do this with households with more than one person if (household.Persons.Length >= 2 && household.NumberOfAdults > 0) { // Figure out how many times this home is going to go on a joint market trip int howManyTimes = TimeTable.GetFrequency(household, Activity.JointMarket, random, householdPD, 0, generationAdjustment); // Processes each of those trips for (int i = 0; i < howManyTimes; i++) { int numEpisodeAdults = Distribution.GetNumAdultsJointEpisode(household, random, Activity.JointMarket); bool success = false; // continue to try until either we get it to work or we fail to schedule this episode for (int attempt = 0; !success && attempt < Scheduler.EpisodeSchedulingAttempts; attempt++) { if (!TimeTable.GetStartTime(household, Activity.JointMarket, random, out Time startTime)) { continue; } if (!TimeTable.GetDuration(household, Activity.JointMarket, startTime, random, out Time duration)) { continue; } // Now that we have our start time and duration, compute our end time Time endTime = startTime + duration; if (availableAdults.Count > 0) { availableAdults.Clear(); } Time workSchoolStartTime, workSchoolEndTime; bool available; foreach (var person in household.Persons) { workSchoolStartTime = SchedulerPerson.GetWorkSchoolStartTime(person); workSchoolEndTime = SchedulerPerson.GetWorkSchoolEndTime(person); // this person is available if available = (workSchoolStartTime > endTime) | (workSchoolEndTime < startTime) | (workSchoolStartTime == Time.Zero); if (person.Age >= 16 && available) { availableAdults.Add(person); } } if ((availableAdults.Count > 0) & (availableAdults.Count >= numEpisodeAdults)) { Episode jointMarketEpisode; jointMarketEpisode = new ActivityEpisode(new TimeWindow(startTime, endTime), Activity.JointMarket, availableAdults[0]); foreach (ITashaPerson adult in availableAdults) { jointMarketEpisode.AddPerson(adult); } Project jointMarketProject = household.GetJointMarketProject(); Schedule jointMarketSchedule = jointMarketProject.Schedule; bool insert = jointMarketSchedule.Insert(jointMarketEpisode, random); success = insert; } } } } return(true); }