Пример #1
0
        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);
        }
Пример #2
0
        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);
        }
Пример #3
0
        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--;
            }
        }
Пример #4
0
        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);
        }
Пример #5
0
 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);
 }
Пример #6
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);
        }