public static int GetNumberOfPeople(Gender gender, int year, int age) { GenderYearAge input = new GenderYearAge(gender, year, age); foreach (GenderYearAge key in NumberOfPeople.Keys) { if (key == input) { return(Convert.ToInt32(Math.Round(NumberOfPeople[key]))); } } throw new Exception("There are not this data " + gender + " " + year + " " + age); }
private static Dictionary <GenderYearAge, double> ReadAgesFile(Gender gender) { Dictionary <GenderYearAge, double> result = new Dictionary <GenderYearAge, double>(); string fileName = gender == Gender.male ? "Males.txt" : "Females.txt"; StreamReader People = new StreamReader(directory + fileName); string peopleData = People.ReadToEnd().Trim('\n'); string[] CurrentAge = peopleData.Split('\n'); for (int i = 0; i < CurrentAge.Length; i++) { string[] CurrentNumber = CurrentAge[i].Trim('\t').Split('\t'); for (int j = 0; j < CurrentNumber.Length; j++) { GenderYearAge genderYearAge = new GenderYearAge(gender, 1990 + j, i); result.Add(genderYearAge, Convert.ToDouble(CurrentNumber[j])); } } return(result); }
static private void ResidentNonResidentMarriages(Population result, int year, bool areMalesResidents) { Gender ResidentGender, SpouseGender; if (areMalesResidents) { ResidentGender = Gender.male; SpouseGender = Gender.female; } else { ResidentGender = Gender.female; SpouseGender = Gender.male; } var tomarry = result.citizens.FindAll(x => x.gender == ResidentGender && x.state == State.resident && x.RelationshipStatus == MarriageStatus.single && x.age >= MinimumAgeOfCrossStatusMarriages && x.age <= MaximumAgeOfCrossStatusMarriages); int current = tomarry.Count; int need = 0; for (int age = MinimumAgeOfCrossStatusMarriages; age < MaximumAgeForControlStatistics; age++) { int y = year; Gender gen = ResidentGender; int a = age; GenderYearAge key = new GenderYearAge(gen, y, a); need += Chances.Singles[key.ToInt()]; } int WorkINdex = 0; var spousesOverseas = result.citizens.FindAll(x => x.gender == SpouseGender && x.state == State.nonresident && x.RelationshipStatus == MarriageStatus.single && x.age >= MinimumAgeOfCrossStatusMarriages && x.age <= MaximumAgeOfSpouseOverseas); while (current > need) { tomarry[WorkINdex].Marry(spousesOverseas[WorkINdex]); WorkINdex++; current--; } }
static public Population CreateInitialPopulation(int year) { //Residents Population result = new Population(); for (int i = 0; i < MaximulAgeInInitialPopulation; i++) { int NumberOfPersons = Chances.GetNumberOfPeople(Gender.male, year, i); for (int j = 0; j < NumberOfPersons; j++) { result.citizens.Add(Person.Initial(Gender.male, i)); result.CurrentId++; } NumberOfPersons = Chances.GetNumberOfPeople(Gender.female, year, i); for (int j = 0; j < NumberOfPersons; j++) { result.citizens.Add(Person.Initial(Gender.female, i)); result.CurrentId++; } } result.ReWriteCHarasteristics(year); //Non-residents int NonResidents = Chances.GetNonResidentalPOpulation(year, method: Method.statistical); for (int j = 0; j < NonResidents; j++) { result.citizens.Add(Person.Initial(result)); } Dictionary <Tuple <int, Gender>, int> set = new Dictionary <Tuple <int, Gender>, int>(); List <Gender> genders = new List <Gender>() { Gender.male, Gender.female }; //Determine widowed ;( persons for (int a = MinimumMarriageAgeInitialPopultion; a < MaximulAgeInInitialPopulation; a++) { int age = a; GenderYearAge genderYearAgeM = new GenderYearAge(Gender.male, year, age); GenderYearAge genderYearAgeF = new GenderYearAge(Gender.female, year, age); List <Person> peopleM, peopleF; if (a < AgeOfOldPeopleInitialPopulation) { peopleM = result.citizens.FindAll(x => x.gender == Gender.male && x.state == State.resident && x.age == a); peopleF = result.citizens.FindAll(x => x.gender == Gender.female && x.state == State.resident && x.age == a); } else { peopleM = result.citizens.FindAll(x => x.gender == Gender.male && x.state == State.resident && (x.age == a || x.age == a + AgeGroupSize)); peopleF = result.citizens.FindAll(x => x.gender == Gender.female && x.state == State.resident && (x.age == a || x.age == a + AgeGroupSize)); } for (int i = 0; i < Chances.Widowed[genderYearAgeM.ToInt()]; i++) { peopleM[i].RelationshipStatus = MarriageStatus.widowed; } for (int i = 0; i < Chances.Widowed[genderYearAgeF.ToInt()]; i++) { peopleF[i].RelationshipStatus = MarriageStatus.widowed; } } //Determine divorced people for (int a = MinimumMarriageAgeInitialPopultion; a < MaximulAgeInInitialPopulation; a++) { int age = a; GenderYearAge genderYearAgeM = new GenderYearAge(Gender.male, year, age); GenderYearAge genderYearAgeF = new GenderYearAge(Gender.female, year, age); List <Person> peopleM, peopleF; if (a < AgeOfOldPeopleInitialPopulation) { peopleM = result.citizens.FindAll(x => x.gender == Gender.male && x.state == State.resident && x.age == a && x.RelationshipStatus == MarriageStatus.single); peopleF = result.citizens.FindAll(x => x.gender == Gender.female && x.state == State.resident && x.age == a && x.RelationshipStatus == MarriageStatus.single); } else { peopleM = result.citizens.FindAll(x => x.gender == Gender.male && x.state == State.resident && (x.age == a || x.age == a + 10)); peopleF = result.citizens.FindAll(x => x.gender == Gender.female && x.state == State.resident && (x.age == a || x.age == a + 10)); } for (int i = 0; i < Chances.Divorced[genderYearAgeM.ToInt()]; i++) { peopleM[i].RelationshipStatus = MarriageStatus.divorced; } for (int i = 0; i < Chances.Divorced[genderYearAgeF.ToInt()]; i++) { peopleF[i].RelationshipStatus = MarriageStatus.divorced; } } //Determine Married people for (int a = MinimumMarriageAgeInitialPopultion; a < MaximulAgeInInitialPopulation; a++) { int age = a; GenderYearAge genderYearAgeM = new GenderYearAge(Gender.male, year, age); List <Person> peopleM = result.citizens.FindAll(x => x.gender == Gender.male && x.age == a && x.RelationshipStatus == MarriageStatus.single && x.state == State.resident); List <Person> Spouses = new List <Person>(); int AgeDifference = 0; do { Spouses = result.citizens.FindAll(x => (x.age <= a + AgeDifference && x.age >= a - AgeDifference) && x.RelationshipStatus == MarriageStatus.single && x.gender == Gender.female); AgeDifference++; }while (Spouses.Count < peopleM.Count); for (int i = 0; i < Math.Min(Chances.Married[genderYearAgeM.ToInt()], peopleM.Count); i++) { var spouse = Spouses[i]; peopleM[i].Marry(spouse); } } // Male Resident + Females Non-residents marriages ResidentNonResidentMarriages(result, year, true); // Female Resident + Males Non-residents marriages ResidentNonResidentMarriages(result, year, false); return(result); }
public static double GetChanceToDie(Gender gender, int year, int age, Method method = Method.analytical) { if (method == Method.statistical) { GenderYearAge input = new GenderYearAge(gender, year, age); int key = input.ToInt(); return(ChancesToDieList[key]); } if (method == Method.analytical) { double result = 0; int a = year - 1989; if (gender == Gender.male && age == 0) { result = -1.507 * Math.Log(a) + 6.8696; } if (gender == Gender.male && (age >= 1 && age <= 4)) { result = -0.091 * Math.Log(a) + 0.4523; } if (gender == Gender.male && (age >= 5 && age <= 9)) { result = -0.046 * Math.Log(a) + 0.2429; } if (gender == Gender.male && (age >= 10 && age <= 14)) { result = -0.076 * Math.Log(a) + 0.369; } if (gender == Gender.male && (age >= 15 && age <= 19)) { result = -0.106 * Math.Log(a) + 0.608; } if (gender == Gender.male && (age >= 20 && age <= 24)) { result = -0.152 * Math.Log(a) + 0.9565; } if (gender == Gender.male && (age >= 25 && age <= 29)) { result = -0.155 * Math.Log(a) + 0.9186; } if (gender == Gender.male && (age >= 30 && age <= 34)) { result = -0.185 * Math.Log(a) + 1.0377; } if (gender == Gender.male && (age >= 35 && age <= 39)) { result = -0.237 * Math.Log(a) + 1.5282; } if (gender == Gender.male && (age >= 40 && age <= 44)) { result = -0.365 * Math.Log(a) + 2.441; } if (gender == Gender.male && (age >= 45 && age <= 49)) { result = -0.713 * Math.Log(a) + 4.2964; } if (gender == Gender.male && (age >= 50 && age <= 54)) { result = -1.326 * Math.Log(a) + 7.7206; } if (gender == Gender.male && (age >= 55 && age <= 59)) { result = -2.518 * Math.Log(a) + 13.957; } if (gender == Gender.male && (age >= 60 && age <= 64)) { result = -4.742 * Math.Log(a) + 24.841; } if (gender == Gender.male && (age >= 65 && age <= 69)) { result = -6.697 * Math.Log(a) + 38.041; } if (gender == Gender.male && (age >= 70 && age <= 74)) { result = -9.03 * Math.Log(a) + 56.477; } if (gender == Gender.male && (age >= 75 && age <= 79)) { result = -11.66 * Math.Log(a) + 83.901; } if (gender == Gender.male && (age >= 80 && age <= 84)) { result = -12.69 * Math.Log(a) + 116.78; } if (gender == Gender.male && (age >= 85)) { result = -4.116 * Math.Log(a) + 148.27; } if (gender == Gender.female && age == 0) { result = -1.313 * Math.Log(a) + 5.9082; } if (gender == Gender.female && (age >= 1 && age <= 4)) { result = -0.06 * Math.Log(a) + 0.3257; } if (gender == Gender.female && (age >= 5 && age <= 9)) { result = -0.018 * Math.Log(a) + 0.1573; } if (gender == Gender.female && (age >= 10 && age <= 14)) { result = -0.053 * Math.Log(a) + 0.2716; } if (gender == Gender.female && (age >= 15 && age <= 19)) { result = -0.042 * Math.Log(a) + 0.3145; } if (gender == Gender.female && (age >= 20 && age <= 24)) { result = -0.067 * Math.Log(a) + 0.4171; } if (gender == Gender.female && (age >= 25 && age <= 29)) { result = -0.077 * Math.Log(a) + 0.4547; } if (gender == Gender.female && (age >= 30 && age <= 34)) { result = -0.111 * Math.Log(a) + 0.6547; } if (gender == Gender.female && (age >= 35 && age <= 39)) { result = -0.185 * Math.Log(a) + 1.016; } if (gender == Gender.female && (age >= 40 && age <= 44)) { result = -0.27 * Math.Log(a) + 1.5852; } if (gender == Gender.female && (age >= 45 && age <= 49)) { result = -0.413 * Math.Log(a) + 2.5501; } if (gender == Gender.female && (age >= 50 && age <= 54)) { result = -0.826 * Math.Log(a) + 4.7064; } if (gender == Gender.female && (age >= 55 && age <= 59)) { result = -1.571 * Math.Log(a) + 8.2739; } if (gender == Gender.female && (age >= 60 && age <= 64)) { result = -2.533 * Math.Log(a) + 13.43; } if (gender == Gender.female && (age >= 65 && age <= 69)) { result = -4.353 * Math.Log(a) + 22.917; } if (gender == Gender.female && (age >= 70 && age <= 74)) { result = -7.263 * Math.Log(a) + 38.687; } if (gender == Gender.female && (age >= 75 && age <= 79)) { result = -9.578 * Math.Log(a) + 59.762; } if (gender == Gender.female && (age >= 80 && age <= 84)) { result = -11.49 * Math.Log(a) + 87.708; } if (gender == Gender.female && age >= 85) { result = -8.574 * Math.Log(a) + 139.41; } return(result / 1000); } return(0); }
private static Dictionary <GenderYearAge, int> GetRelationships(string v) { Dictionary <GenderYearAge, int> result = new Dictionary <GenderYearAge, int>(); List <List <int> > data = ReadTable(v); for (int i = 0; i < data.Count; i++) { for (int j = 0; j < data[i].Count; j++) { int year = 0; if (j == 0) { year = j + 1980; } else { year = j + 1982; } Gender gender = i % 2 == 0 ? Gender.male : Gender.female; int age = 20 + 10 * Convert.ToInt32(Math.Floor((decimal)i / 2)); for (int k = 0; k < 10; k++) { GenderYearAge GYA = new GenderYearAge(gender, year, age + k); result.Add(GYA, Convert.ToInt32(Math.Round((decimal)data[i][j] / 10, 0))); } } } for (int i = 0; i < 10; i++) { Dictionary <GenderYearAge, int> mixer = new Dictionary <GenderYearAge, int>(); foreach (GenderYearAge key in result.Keys) { if (key.age == 20) { GenderYearAge next = new GenderYearAge(key.gender, key.year, key.age + 1); GenderYearAge current = new GenderYearAge(key.gender, key.year, key.age); int value = Convert.ToInt32(Math.Round((double)(result[next] + result[current]) / 2.00)); mixer.Add(key, value); } else if (key.age == 79) { GenderYearAge previous = new GenderYearAge(key.gender, key.year, key.age - 1); GenderYearAge current = new GenderYearAge(key.gender, key.year, key.age); int value = Convert.ToInt32(Math.Round((double)(result[previous] + result[current]) / 2.00)); mixer.Add(key, value); } else { GenderYearAge next = new GenderYearAge(key.gender, key.year, key.age + 1); GenderYearAge previous = new GenderYearAge(key.gender, key.year, key.age - 1); GenderYearAge current = new GenderYearAge(key.gender, key.year, key.age); int value = Convert.ToInt32(Math.Round((double)(result[previous] + result[current] + result[next]) / 3.00)); mixer.Add(key, value); } } result = mixer; } List <List <int> > DataAfterMixing = new List <List <int> >(); for (int i = 0; i < data.Count; i++) { DataAfterMixing.Add(new List <int>()); for (int j = 0; j < data[i].Count; j++) { Gender ControlGender; int ControlYear; int ControlMinimumAge = 0; int ControlMaximumAge = 0; if (i % 2 == 0) { ControlGender = Gender.male; } else { ControlGender = Gender.female; } if (j == 0) { ControlYear = j + 1980; } else { ControlYear = j + 1982; } if (i == 0 || i == 1) { ControlMinimumAge = 20; ControlMaximumAge = 29; } if (i == 2 || i == 3) { ControlMinimumAge = 30; ControlMaximumAge = 39; } if (i == 4 || i == 5) { ControlMinimumAge = 40; ControlMaximumAge = 49; } if (i == 6 || i == 7) { ControlMinimumAge = 50; ControlMaximumAge = 59; } if (i == 8 || i == 9) { ControlMinimumAge = 60; ControlMaximumAge = 69; } if (i == 10 || i == 11) { ControlMinimumAge = 70; ControlMaximumAge = 79; } int ControlPOpulation = 0; for (int age = ControlMinimumAge; age < ControlMaximumAge + 1; age++) { GenderYearAge key = new GenderYearAge(ControlGender, ControlYear, age); ControlPOpulation += result[key]; } DataAfterMixing[i].Add(ControlPOpulation); } } for (int i = 0; i < DataAfterMixing.Count; i++) { for (int j = 0; j < DataAfterMixing[i].Count; j++) { Gender ControlGender; int ControlYear; int ControlMinimumAge = 0; int ControlMaximumAge = 0; if (i % 2 == 0) { ControlGender = Gender.male; } else { ControlGender = Gender.female; } if (j == 0) { ControlYear = j + 1980; } else { ControlYear = j + 1982; } if (i == 0 || i == 1) { ControlMinimumAge = 20; ControlMaximumAge = 29; } if (i == 2 || i == 3) { ControlMinimumAge = 30; ControlMaximumAge = 39; } if (i == 4 || i == 5) { ControlMinimumAge = 40; ControlMaximumAge = 49; } if (i == 6 || i == 7) { ControlMinimumAge = 50; ControlMaximumAge = 59; } if (i == 8 || i == 9) { ControlMinimumAge = 60; ControlMaximumAge = 69; } if (i == 10 || i == 11) { ControlMinimumAge = 70; ControlMaximumAge = 79; } for (int age = ControlMinimumAge; age < ControlMaximumAge + 1; age++) { GenderYearAge key = new GenderYearAge(ControlGender, ControlYear, age); int difference = data[i][j] - DataAfterMixing[i][j]; double multiplier = 0; if (ControlMinimumAge == 20 && age < 25) { multiplier = (double)(5 - age % 5) / 15.0; } else if (ControlMaximumAge == 79 && age > 74) { multiplier = (double)(age % 5 + 1) / 15.0; } else if (ControlMinimumAge != 20 && ControlMaximumAge != 79 && age % 10 < 5) { multiplier = (double)(5 - age % 5) / 30.0; } else if (ControlMinimumAge != 20 && ControlMaximumAge != 79 && age % 10 >= 5) { multiplier = (double)(age % 5 + 1) / 30.0; } result[key] += Convert.ToInt32(Math.Round(difference * multiplier)); if (key.age >= 70 && key.age <= 79) { double part = (double)(101 - 5 * (age - 69)) / (double)100; int rest = Convert.ToInt32(result[key] * (1 - part)); result[key] = Convert.ToInt32(result[key] * part); int newage = 159 - age; GenderYearAge keynew = new GenderYearAge(key.gender, key.year, newage); result.Add(keynew, rest); } } } } return(result); }