Пример #1
0
        /// <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++;
            }
        }
Пример #2
0
        /// <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);
            }
        }
Пример #3
0
 public void CalcFurier()
 {
     this._furier = MyConst.CsharpDFT(this._data);
 }
Пример #4
0
        /// <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