private void Mutation()//добавляет новй геном изменяя один из существующих { Genom tmp = new Genom { age = 0, del = false, genomList = new List <int>(), t = 'm' }; int coutn = poolLIst.Count / 10; int begin = coutn * 9; int numGenom = begin + random.Next(coutn); tmp.genomList = poolLIst[numGenom].genomList.GetRange(0, genomCount); int changGen = random.Next(genomCount); int genValue = random.Next(genCount); tmp.genomList[changGen] = genValue; tmp.Raiting(genCount, inputData, MO); poolLIst.Add(tmp); }
private void AddChildren()//создание дочернего генома из двух родительских { Genom tmp = new Genom { age = 0, del = false, genomList = new List <int>(), t = 'c' }; int mid = poolLIst.Count / 2; Genom p1 = poolLIst[random.Next(mid)]; Genom p2 = poolLIst[mid + random.Next(mid)]; for (int i = 0; i < p1.genomList.Count; i++) { if (random.Next(2) == 0) { tmp.genomList.Add(p1.genomList[i]); } else { tmp.genomList.Add(p2.genomList[i]); } } tmp.Raiting(genCount, inputData, MO); poolLIst.Add(tmp); }
private void SoWeak() { int deathCount = poolLIst.Count * mortality / 100; for (int i = 0; i < deathCount; i++) { //if (poolLIst[i].age > maxAge / 10) { Genom tmp = poolLIst[i]; tmp.del = true; tmp.dt = 'w'; poolLIst[i] = tmp; } } }
private void SoAld() { if (maxAge != 0 && poolLIst.Count != 0) { for (int i = 0; i < poolLIst.Count; i++) { if (poolLIst[i].age > maxAge) { Genom tmp = poolLIst[i]; tmp.del = true; tmp.dt = 'a'; poolLIst[i] = tmp; } } } }
private void NotDouble() { for (int i = 0; i < poolLIst.Count - 1; i++) { for (int j = i + 1; j < poolLIst.Count; j++) { if (poolLIst[i].genomList.SequenceEqual(poolLIst[j].genomList)) { Genom tmp = poolLIst[i]; tmp.del = true; tmp.dt = 'd'; poolLIst[i] = tmp; } } } }
private void AddRandom()//создание рандомнго генома !!!!!!!!!!!! { Genom tmp = new Genom { age = 0, del = false, genomList = new List <int>(), t = 'r' }; for (int i = 0; i < genomCount; i++) { tmp.genomList.Add(random.Next(genCount)); } tmp.Raiting(genCount, inputData, MO); poolLIst.Add(tmp); }
private void Selection() { // Console.WriteLine("selection"); for (int i = 0; i < poolLIst.Count; i++)//костыль { Genom tmp = poolLIst[i]; tmp.age++; poolLIst[i] = tmp; } poolLIst.Sort(delegate(Genom g1, Genom g2) { return(g2.rate.CompareTo(g1.rate)); }); if (poolLIst.Last().rate <= best.rate) { best = poolLIst.Last(); } if (best.genomList == null) { best.rate = 1000; } SoAld(); SoWeak(); NotDouble(); poolLIst.RemoveAll(delegate(Genom x) { if (x.del && x.age > 0) { return(true); } else { return(false); } }); int curPoolSize = poolLIst.Count; int need = poolSize - curPoolSize; int burn = need * childCount / foolCount; int mut = need * muttionCout / foolCount; //проодим скрещивания for (int i = 0; i < burn; i++) { AddChildren(); } //проодим мутаации for (int i = 0; i < mut; i++) { Mutation(); } while (poolLIst.Count < poolSize) { AddRandom(); //дополняем пул случайными геномами } }