//Метод скрещивания двух индивидов
 public static void Replicate(List <Individ> individs, Individ par1, Individ par2, int MaxParameterValue, int CountParameter, int CountChild, Random rnd)
 {
     for (int i = 0; i < CountChild; i++)
     {
         individs.Add(Individ.Mix(par1, par2, MaxParameterValue, CountParameter, rnd));
     }
 }
        //Метод создания нового случайного индивида
        public static Individ NewRandomIndivid(int maxParameter, int countParameter, Random rnd)
        {
            Individ ind = new Individ();

            ind.Parameters = Program.NewRandomParameters(maxParameter, countParameter, rnd);

            return(ind);
        }
 //Метод скрещивания всех родителей
 public static void ReplicateAll(List <Individ> individs, int MaxParameterValue, int CountParameter, int CountIndivid, Random rnd)
 {
     Individ.Replicate(individs, individs[0], individs[1], MaxParameterValue, CountParameter, CountIndivid / 4, rnd);
     Individ.Replicate(individs, individs[2], individs[3], MaxParameterValue, CountParameter, CountIndivid / 4, rnd);
     Individ.Replicate(individs, individs[0], individs[2], MaxParameterValue, CountParameter, CountIndivid / 4, rnd);
     Individ.Replicate(individs, individs[1], individs[3], MaxParameterValue, CountParameter, CountIndivid / 4, rnd);
     individs.Remove(individs[0]);
     individs.Remove(individs[0]);
     individs.Remove(individs[0]);
     individs.Remove(individs[0]);
 }
        //Метод создания новой популяции
        public static List <Individ> CreateNewPopulation(int CountIndivid, int MaxParameterValue, int CountParameter, Random rnd)
        {
            //Создание листа с индивидами
            List <Individ> individs = new List <Individ>();

            for (int i = 0; i < CountIndivid; i++)
            {
                individs.Add(Individ.NewRandomIndivid(MaxParameterValue, CountParameter, rnd));
            }
            return(individs);
        }
        //Метод селекции
        public static void Select(List <Individ> individs, int CountIndivid, int MaxParameterValue, int CountParameter, Random rnd)
        {
            Individ par1 = individs[0];
            Individ par2 = individs[1];
            Individ par3 = individs[2];
            Individ par4 = individs[3];

            individs.RemoveAll(x => x is Individ);

            individs.Add(par1);
            individs.Add(par2);
            individs.Add(par3);
            individs.Add(par4);
        }
        //Метод смешения генов
        public static Individ Mix(Individ par1, Individ par2, int MaxParameterValue, int CountParameter, Random rnd)
        {
            Individ NewInd = Individ.NewRandomIndivid(MaxParameterValue, CountParameter, rnd);

            for (int i = 0; i < CountParameter; i++)
            {
                if (rnd.Next(2) == 0)
                {
                    NewInd.Parameters[i] = par1.Parameters[i];
                }
                else
                {
                    NewInd.Parameters[i] = par2.Parameters[i];
                }
            }
            return(NewInd);
        }
        //Метод одной итерации ГА
        public static void Iteration(
            int CountIndivid,
            int MaxParameterValue,
            int CountParameter,
            List <int> TargetParameters,
            int ProbabilityMutation,
            int MaxMutationValue,
            Random rnd,
            List <Individ> individs)
        {
            //Селекция по пригодности(остается 4 лучших особи)
            Individ.Select(individs, CountIndivid, MaxParameterValue, CountIndivid, rnd);

            //Скрещивание
            //Выбираю случайные гены от родителей и вставляю потомкам
            //смешиваю 1 и 2, 2 и 4, 1 и 3, 2 и 4 родителя, каждая пара дает 1/4 всей популяции
            Individ.ReplicateAll(individs, MaxParameterValue, CountParameter, CountIndivid, rnd);

            //Мутация
            //Вероятность мутации индивидв и гена одинакова
            //При захождении мутации за край значения параметра она возвращается с другой стороны, значения циклично.
            MutationAll(individs, ProbabilityMutation, MaxMutationValue, CountParameter, MaxParameterValue, rnd);
        }