/// <summary> /// Метод простой не умной генерации на основе случайных чисел /// </summary> /// <param name="nextgeneration">номер следующего поколения</param> public void CreateNextGenerationSimple(int nextgeneration, List <int> NoizeList) { //ИТАК НАЧНЕМ Random myRandomizer = new Random(); int startId; startId = 1000 * nextgeneration + 1; int f, m; float myaver = new float(); // цикл по кол-ву элементов в этом НОВОМ поколении for (int i = 0; i < MyConst.FILTERINGENERATION; i++) { OneFilter myNewfilter = new OneFilter(); OneFilter myFatherFilter = new OneFilter(); OneFilter myMotherFilter = new OneFilter(); f = 0; m = 0; while (f == m) { f = myRandomizer.Next(MyConst.FILTERINGENERATION); m = myRandomizer.Next(MyConst.FILTERINGENERATION); } myNewfilter.ID = startId; startId++; myFatherFilter = this.getMyOneFilterByGenerByIndex(nextgeneration - 1, f); myMotherFilter = this.getMyOneFilterByGenerByIndex(nextgeneration - 1, m); //пока механизм генерации очень прост for (int j = 0; j < myFatherFilter.countOfFilterData; j++) { myaver = (myFatherFilter.data[j] + myMotherFilter.data[j]) / 2; myNewfilter.data.Add(myaver); } myNewfilter.countOfFilterData = myFatherFilter.countOfFilterData; myNewfilter.fatherID = myFatherFilter.ID; myNewfilter.motherID = myMotherFilter.ID; myNewfilter.Normalize(); // myNewfilter.CalcFurier(); this.generationList[nextgeneration].Add(myNewfilter); // и самая главная на сегодня строчка } //цикл по кол-ву новых фильтров в поколении int popitka = 0; while ((MyConst.isNessMutation(this._generationList[nextgeneration])) && (popitka < 1)) { this._generationList[nextgeneration].AddRandomNoize(NoizeList); popitka++; } }
/// <summary> /// Основная функция генерация /// </summary> /// <param name="nextgeneration"> номер будующего поколения </param> /// <param name="rate_skolko_ost_starih">Сколько процентов оставить старых от полного числа фильтра в этих поколениях</param> public void CreateNextGeneration(int nextgeneration, float rate_skolko_ost_starih, List <int> myNoize, int kolvovpokolenii) { //тут предполагаем что в в элементе //generationlist[nextgeneration-1] уже сидят фильтры // и они упорядочены по убыванитю нужного нам критерия // добавим их сначала в наше новое поколение OneFilter tempFilter = new OneFilter(); //for (int i = 0; i < rate_skolko_ost_starih * MyConst.FILTERINGENERATION[nextgeneration - 1]; i++) for (int i = 0; i < rate_skolko_ost_starih * kolvovpokolenii; i++) { tempFilter = this.getMyOneFilterByGenerByIndex(nextgeneration - 1, i); this.generationList[nextgeneration].Add(tempFilter); } Random myRandomizer = new Random(); int startId; startId = 1000 * nextgeneration + 1; int f, m; float myaver = new float(); //for (int i = 0; i < (1 - rate_skolko_ost_starih) * MyConst.FILTERINGENERATION[nextgeneration]; i++) for (int i = 0; i < (1 - rate_skolko_ost_starih) * kolvovpokolenii; i++) { OneFilter myNewfilter = new OneFilter(); OneFilter myFatherFilter = new OneFilter(); OneFilter myMotherFilter = new OneFilter(); f = 0; m = 0; while (f == m) { //f = myRandomizer.Next(MyConst.FILTERINGENERATION[nextgeneration - 1] / 2); //наполовину потому что фильтры отсортированы по крутизне в порядке убывания и нужно только от лучших потомки //m = myRandomizer.Next(MyConst.FILTERINGENERATION[nextgeneration - 1] / 2); f = myRandomizer.Next((int)Math.Round(kolvovpokolenii * rate_skolko_ost_starih)); //наполовину потому что фильтры отсортированы по крутизне в порядке убывания и нужно только от лучших потомки m = myRandomizer.Next((int)Math.Round(kolvovpokolenii * rate_skolko_ost_starih)); } myNewfilter.ID = startId; startId++; myFatherFilter = this.getMyOneFilterByGenerByIndex(nextgeneration - 1, f); myMotherFilter = this.getMyOneFilterByGenerByIndex(nextgeneration - 1, m); //пока механизм генерации очень прост for (int j = 0; j < myFatherFilter.countOfFilterData; j++) { myaver = (myFatherFilter.data[j] + myMotherFilter.data[j]) / 2; myNewfilter.data.Add(myaver); } myNewfilter.countOfFilterData = myFatherFilter.countOfFilterData; myNewfilter.fatherID = myFatherFilter.ID; myNewfilter.motherID = myMotherFilter.ID; myNewfilter.Normalize(); // myNewfilter.CalcFurier(); this.generationList[nextgeneration].Add(myNewfilter); // и самая главная на сегодня строчка } //на этом этапе новое поколение сформировано полностью //теперь проверим его и при необходимости запустим мутацию int popitka = 0; while ((MyConst.isNessMutation(this._generationList[nextgeneration])) && (popitka < 1)) { this._generationList[nextgeneration].AddRandomNoize(myNoize); popitka++; } } //CreateNextGeneration