/// <summary> /// Funky function directly from Tasha original /// </summary> /// <param name="person"></param> /// <returns></returns> internal static PersonWorkSchoolProjectStatus GetWorkSchoolProjectStatus(ITashaPerson person) { //TashaTime workSchoolStartTime = (person["SData"] as SchedulerPersonData).; Time workSchoolStartTime = SchedulerPerson.GetWorkSchoolStartTime(person); Time workSchoolEndTime = SchedulerPerson.GetWorkSchoolEndTime(person); PersonWorkSchoolProjectStatus workSchoolProjectStatus = PersonWorkSchoolProjectStatus.NoWorkOrSchool; if (workSchoolStartTime <= Time.StartOfDay) { workSchoolProjectStatus = PersonWorkSchoolProjectStatus.NoWorkOrSchool; } else if ((workSchoolEndTime - workSchoolStartTime) >= Scheduler.FullTimeActivity) { if (workSchoolEndTime <= new Time() { Hours = 14 }) { workSchoolProjectStatus = PersonWorkSchoolProjectStatus.FullTimeNoEveningWorkOrSchool; } else if (workSchoolStartTime >= new Time() { Hours = 9 }) { workSchoolProjectStatus = PersonWorkSchoolProjectStatus.FullTimeEveningWorkOrSchool; } else { workSchoolProjectStatus = PersonWorkSchoolProjectStatus.FullTimeDayAndEveningWorkOrSchool; } } else if (workSchoolEndTime - workSchoolStartTime < Scheduler.FullTimeActivity) { if (workSchoolEndTime <= new Time() { Hours = 9 }) { workSchoolProjectStatus = PersonWorkSchoolProjectStatus.PartTimeDay; } else if (workSchoolEndTime <= new Time() { Hours = 14 }) { workSchoolProjectStatus = PersonWorkSchoolProjectStatus.PartTimeEvening; } else { workSchoolProjectStatus = PersonWorkSchoolProjectStatus.Other; } } return(workSchoolProjectStatus); }
public static HouseholdWorkSchoolProjectStatus GetWorkSchoolProjectStatus(ITashaHousehold household) { bool evening_workschool = false; bool morning_workschool = false; bool any_workschool = false; foreach (var person in household.Persons) { PersonWorkSchoolProjectStatus workschoolProjectStatus = SchedulerPerson.GetWorkSchoolProjectStatus(person); if (workschoolProjectStatus == PersonWorkSchoolProjectStatus.FullTimeEveningWorkOrSchool || workschoolProjectStatus == PersonWorkSchoolProjectStatus.FullTimeDayAndEveningWorkOrSchool || workschoolProjectStatus == PersonWorkSchoolProjectStatus.Other) { evening_workschool = true; } if (workschoolProjectStatus == PersonWorkSchoolProjectStatus.FullTimeNoEveningWorkOrSchool || workschoolProjectStatus == PersonWorkSchoolProjectStatus.FullTimeDayAndEveningWorkOrSchool || workschoolProjectStatus == PersonWorkSchoolProjectStatus.PartTimeDay || workschoolProjectStatus == PersonWorkSchoolProjectStatus.PartTimeEvening) { morning_workschool = true; } if (workschoolProjectStatus > 0) { any_workschool = true; } } if (!any_workschool) { return(HouseholdWorkSchoolProjectStatus.NoWorkOrSchool); // noone in hhld works or attends school today } else if (!evening_workschool) { return(HouseholdWorkSchoolProjectStatus.NoEveningWorkOrSchool); //there is work/school, but none after 6:00pm } else if (!morning_workschool) { return(HouseholdWorkSchoolProjectStatus.EveningWorkOrSchool); //there is evening work/school, but no work/school before 1:00pm } else { return(HouseholdWorkSchoolProjectStatus.DayAndEveningWorkOrSchool); // there is work/school before 1pm and after 6pm } }
private void GraphTripPurpose(Distribution.DistributionInformation[] distributionData) { TashaHousehold Household = new TashaHousehold(); TashaPerson person = new TashaPerson(); List <int> primaryWork = new List <int>(); person.Licence = false; person.Male = GenderLocal; SchedulerHousehold.CreateHouseholdProjects(Household); SchedulerPerson.InitializePersonalProjects(person); SchedulerPerson.GenerateWorkSchoolSchedule(person, null); SchedulerTripChain.GetTripChain(person); var trip = SchedulerTrip.GetTrip(0); Occupation[] Occupations = { Occupation.Professional, Occupation.Manufacturing, Occupation.Retail, Occupation.Office, Occupation.Unknown, Occupation.NotEmployed }; LoadDistributioNumbers(person, primaryWork, Occupations); float[] data = new float[this.StartTimeQuantums]; foreach (int ID in primaryWork) { var table = distributionData[ID].StartTimeFrequency; for (int i = 0; i < this.StartTimeQuantums; i++) { for (int j = 0; j < this.MaxFrequencyLocal; j++) { data[i] += table[i][j]; } } } // Make all data in terms of percentages of total. float sum = data.Sum(); for (int number = 0; number < data.Length; number++) { data[number] = data[number] / sum * 100; Writer.WriteLine("{0}, {1}", (Time.FromMinutes((60 * 4) + number * (1440 / this.StartTimeQuantums))), data[number]); } GenerateChart(String.Format("OfficeDur.png"), data, "Time of Day", "Probability"); }
private static bool GenerateJointOtherEpisodes(this ITashaHousehold household, Random random, GenerationAdjustment[] generationAdjustments) { var householdPD = household.HomeZone.PlanningDistrict; //make sure there at least 2 people and one adult if ((household.Persons.Length >= 2) & (household.NumberOfAdults > 0)) { int freqJ = TimeTable.GetFrequency(household, Activity.JointOther, random, householdPD, 0, generationAdjustments); int numEpisodeAdults = Distribution.GetNumAdultsJointEpisode(household, random, Activity.JointOther); for (int i = 0; i < freqJ; i++) { bool success = false; int attempt = 0; while (!success && attempt < Scheduler.EpisodeSchedulingAttempts) { if (!TimeTable.GetStartTime(household, Activity.JointOther, freqJ, random, out Time startTime)) { attempt++; continue; } if (!TimeTable.GetDuration(household, Activity.JointOther, startTime, random, out Time duration)) { attempt++; continue; } if (duration == Time.Zero || startTime == Time.Zero) { attempt++; } else { Time endTime = startTime + duration; List <ITashaPerson> availableAdults = new List <ITashaPerson>(); foreach (ITashaPerson person in household.Persons) { Time workSchoolStartTime = SchedulerPerson.GetWorkSchoolStartTime(person); Time workSchoolEndTime = SchedulerPerson.GetWorkSchoolEndTime(person); bool available = false; if (workSchoolStartTime > endTime || workSchoolEndTime < startTime || workSchoolStartTime == Time.Zero) { available = true; } if (person.Age >= 16 && available) { availableAdults.Add(person); } } if (availableAdults.Count >= numEpisodeAdults && availableAdults.Count > 0) { Episode jointOtherEpisode; var owner = availableAdults[0]; jointOtherEpisode = new ActivityEpisode(new TimeWindow(startTime, endTime), Activity.JointOther, owner); for (int j = 0; j < numEpisodeAdults; j++) { jointOtherEpisode.AddPerson(availableAdults[j]); } Project jointOtherProject = household.GetJointOtherProject(); Schedule jointOtherSchedule = jointOtherProject.Schedule; bool inserted = jointOtherSchedule.Insert(jointOtherEpisode, random); success = true; if (!inserted) { success = false; attempt++; } } else { attempt++; } } } } } return(true); }
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); }
/// <summary> /// Returns the distribution ID that this person belongs to /// </summary> /// <param name="person"></param> /// <returns></returns> internal static int GetDistributionID(ITashaPerson person, Activity activity) { int baseOffset = 0; int ageOffset = 0; int occupationOffset = 0; int age = person.Age; switch (activity) { case Activity.School: baseOffset = 84; ageOffset = 0; occupationOffset = 0; //Now Calculate the occupation offset switch (person.StudentStatus) { case StudentStatus.FullTime: occupationOffset = 0; break; case StudentStatus.PartTime: occupationOffset = 1; break; default: return(-1); } if (age < 11) { return(-1); } //Calculate the ageOffset if (age <= 15) { ageOffset = 0; } else if (age <= 18) { ageOffset = 1; } else if (age <= 25) { ageOffset = 2; } else if (age <= 30) { ageOffset = 3; } else { ageOffset = 4; } return(baseOffset + (ageOffset * 2) + occupationOffset); case Activity.WorkBasedBusiness: // We store the values from the person to improve performance baseOffset = 40; ageOffset = 0; occupationOffset = 0; Tasha.Common.Occupation occupation = person.Occupation; if (person.EmploymentStatus != TTSEmploymentStatus.FullTime && person.EmploymentStatus != TTSEmploymentStatus.PartTime) { return(-1); } //Calculate the ageOffset if (age < 11) { return(-1); } else if (age <= 18) { ageOffset = 0; } else if (age <= 25) { ageOffset = 1; } else if (age <= 64) { ageOffset = 2; } else { ageOffset = 3; } //Now Calculate the occupation offset if (occupation == Occupation.Office) { occupationOffset = 0; } else if (occupation == Occupation.Manufacturing) { occupationOffset = 1; } else if (occupation == Occupation.Professional) { occupationOffset = 2; } else if (occupation == Occupation.Retail) { occupationOffset = 3; } else { return(-1); } return(baseOffset + (ageOffset * 8) + occupationOffset * 2 + (person.EmploymentStatus == TTSEmploymentStatus.FullTime ? 0 : 1)); case Activity.PrimaryWork: // We store the values from the person to improve performance if (person.EmploymentZone == null) { return(-1); } ageOffset = 0; occupationOffset = 0; occupation = person.Occupation; if (person.EmploymentStatus != TTSEmploymentStatus.FullTime && person.EmploymentStatus != TTSEmploymentStatus.PartTime) { return(-1); } //Calculate the ageOffset if (age < 11) { return(-1); } else if (age <= 18) { ageOffset = 0; } else if (age <= 25) { ageOffset = 1; } else if (age <= 64) { ageOffset = 2; } else { ageOffset = 3; } //Now Calculate the occupation offset if (occupation == Occupation.Office) { occupationOffset = 0; } else if (occupation == Occupation.Manufacturing) { occupationOffset = 1; } else if (occupation == Occupation.Professional) { occupationOffset = 2; } else if (occupation == Occupation.Retail) { occupationOffset = 3; } else { return(-1); } return((ageOffset * 8) + occupationOffset * 2 + (person.EmploymentStatus == TTSEmploymentStatus.FullTime ? 0 : 1)); case Activity.SecondaryWork: // We store the values from the person to improve performance baseOffset = 32; occupationOffset = 0; occupation = person.Occupation; if (person.EmploymentZone == null) { return(-1); } if (person.EmploymentStatus != TTSEmploymentStatus.FullTime && person.EmploymentStatus != TTSEmploymentStatus.PartTime) { return(-1); } if (person.Age < 11) { return(-1); } //Now Calculate the occupation offset if (occupation == Occupation.Office) { occupationOffset = 0; } else if (occupation == Occupation.Manufacturing) { occupationOffset = 1; } else if (occupation == Occupation.Professional) { occupationOffset = 2; } else if (occupation == Occupation.Retail) { occupationOffset = 3; } else { return(-1); } // Ok, here we do the math, there are 8 distros per age group [only 1 age group] // Each one is broken into 4 occupation types // Each of them are broken into first, full-time then part-time return (baseOffset + occupationOffset * 2 + (person.EmploymentStatus == TTSEmploymentStatus.FullTime ? 0 : 1)); case Activity.WorkAtHomeBusiness: // We store the values from the person to improve performance baseOffset = 72; ageOffset = 0; occupationOffset = 0; occupation = person.Occupation; age = person.Age; if (person.EmploymentStatus != TTSEmploymentStatus.WorkAtHome_FullTime && person.EmploymentStatus != TTSEmploymentStatus.WorkAtHome_PartTime) { return(-1); } //Calculate the ageOffset if (age < 19) { return(-1); } else if (age <= 25) { ageOffset = 0; } else if (age <= 64) { ageOffset = 1; } else { ageOffset = 2; } //Now Calculate the occupation offset if (occupation == Occupation.Office) { occupationOffset = 0; } else if (occupation == Occupation.Manufacturing) { occupationOffset = 1; } else if (occupation == Occupation.Professional) { occupationOffset = 2; } else if (occupation == Occupation.Retail) { occupationOffset = 3; } // Ok, here we do the math, there are 8 distros per age group // Each one is broken into 4 occupation types // Each of them are broken into first, full-time then part-time return(baseOffset + (ageOffset * 4) + occupationOffset); case Activity.ReturnFromWork: // We store the values from the person to improve performance baseOffset = 94; occupationOffset = 0; occupation = person.Occupation; if (person.EmploymentStatus != TTSEmploymentStatus.FullTime && person.EmploymentStatus != TTSEmploymentStatus.PartTime) { return(-1); } //Now Calculate the occupation offset if (occupation == Occupation.Office) { occupationOffset = 0; } else if (occupation == Occupation.Manufacturing) { occupationOffset = 1; } else if (occupation == Occupation.Professional) { occupationOffset = 2; } else if (occupation == Occupation.Retail) { occupationOffset = 3; } // Ok, here we do the math, there are 8 distros per age group [only 1 age group] // Each one is broken into 4 occupation types // Each of them are broken into first, full-time then part-time return (baseOffset + occupationOffset * 2 + (person.EmploymentStatus == TTSEmploymentStatus.FullTime ? 0 : 1)); case Activity.IndividualOther: baseOffset = 102; ageOffset = 0; occupationOffset = 0; //||[0,6] ||==7 PersonWorkSchoolProjectStatus workProjestStatus = SchedulerPerson.GetWorkSchoolProjectStatus(person); age = person.Age; //Calculate the ageOffset if (age < 11) { return(-1); } else if (age < 16) { ageOffset = 0; } else if (age < 25) { ageOffset = 1; } else if (age < 65) { ageOffset = 2; } else { ageOffset = 3; } // return (baseOffset + (ageOffset * 14) + (person.Female ? 7 : 0) + (int)workProjestStatus); case Activity.Market: baseOffset = 182; ageOffset = 0; occupationOffset = 0; //||[0,6] ||==7 workProjestStatus = SchedulerPerson.GetWorkSchoolProjectStatus(person); age = person.Age; //Calculate the ageOffset if (age < 11) { return(-1); } else if (age < 16) { ageOffset = 0; } else if (age < 25) { ageOffset = 1; } else if (age < 65) { ageOffset = 2; } else { ageOffset = 3; } // Ok, here we do the math, there are 8 distros per age group // Each one is broken into 4 occupation types // Each of them are broken into first, full-time then part-time return (baseOffset + (ageOffset * 14) + (person.Female ? 7 : 0) + (int)workProjestStatus); default: return(-1); } }