//Метод скрещивания двух индивидов 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); }