/// <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> /// Возвращает true если нужно мутировать или false если не нужно /// </summary> /// <param name="myonegeneration"> Принимает экземпляр класса FilterList</param> /// <returns>Делать или Не делать мутацию</returns> public static bool isNessMutation(FilterList myonegeneration) { //[17.02.2014 14:13:56] Федор Пантелеев: это отношение СВО к СРЕДНЕМУ //[17.02.2014 14:14:07] Belobrodsky Vladimir: ааа //[17.02.2014 14:14:26] Федор Пантелеев: если оно ниже определённого значения по определённому % отсчётов поколени фиьлтра то тогда мы добавляем мутации //[17.02.2014 14:14:31] Федор Пантелеев: если нет- не добавляем List <float> variation_coeff = new List <float>(); for (int i = 0; i < myonegeneration[0].data.Count; i++) //идем по длине фильтра { List <float> temparr = new List <float>(); //вспомогательный массив для находения среднего и СКО for (int j = 0; j < myonegeneration.Count; j++) // идем по всем фильтра в этом поколении { temparr.Add(myonegeneration[j].data[i]); } variation_coeff.Add(((float)MyConst.MathSKO(temparr) / temparr.Average())); temparr.Clear(); //variation_coeff.Add(); } int isBad = 0; for (int i = 0; i < variation_coeff.Count; i++) { if (Math.Abs(variation_coeff[i]) < MyConst.RED_LINE_TO_SKO_DIV_AVER) { isBad++; } } float varcoeff_pr = ((float)isBad / variation_coeff.Count) * 100; if (varcoeff_pr > MyConst.RED_LINE_TO_MAKE_MUTATION) { return(true); } else { return(false); } }
public void CalcFurier() { this._furier = MyConst.CsharpDFT(this._data); }
/// <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