コード例 #1
0
        //генерация первой популяции
        private void GenerateFirstPopulation()
        {
            for (int i = 0; i < dataContext.GAParams.PCount; i++)
            {
                //забили входные параметры
                population[i] = Randomize();

                //посчитали выходные параметры
                est           = new Estimation(population[i]);
                popResults[i] = new Results();
                popResults[i] = est.Estimate();

                //посчитали фитнесс
                FitnessCalc(population[i], popResults[i]);
            }
        }
コード例 #2
0
        private void OnExecuteMainWindow()
        {
            est = new Estimation(dataContext.Inputs);

            if (dataContext.Inputs.IsOptimizing)
            {
                gaView             = new GAParameters();
                gaView.DataContext = dataContext;
                gaView.Show();
            }
            else
            {
                ResultsView resView = new ResultsView(est.Estimate());
                resView.Show();
            }
        }
コード例 #3
0
        private void Breeding()
        {
            //посчитали сумму фитнесса
            sumFitness = 0;
            for (int i = 0; i < dataContext.GAParams.PCount; i++)
            {
                sumFitness += popResults[i].Fitness;
            }

            dataContext.GAmodel.AverageFitness = sumFitness / dataContext.GAParams.PCount;

            //определили долю фитнесса каждого
            for (int i = 0; i < dataContext.GAParams.PCount; i++)
            {
                popResults[i].Crossingover = popResults[i].Fitness / sumFitness;
            }

            //выдали каждому диапазон вероятности для скрещивания (от 0 до 1)
            popResults[0].CrossChanceStart = 0;
            popResults[0].CrossChanceEnd   = popResults[0].Crossingover;
            for (int i = 1; i < dataContext.GAParams.PCount; i++)
            {
                popResults[i].CrossChanceStart = popResults[i - 1].CrossChanceEnd;
                popResults[i].CrossChanceEnd   = popResults[i].CrossChanceStart + popResults[i].Crossingover;
            }

            //отбираем родителей методом рулетки
            Roulette();

            //скрещиваем
            Crossingover();

            //мутация
            Mutation();

            //посчитали выходные параметры для детей
            childrenResults = new Results[dataContext.GAParams.ChildrenCount];
            for (int i = 0; i < dataContext.GAParams.ChildrenCount; i++)
            {
                est = new Estimation(children[i]);
                childrenResults[i] = new Results();
                childrenResults[i] = est.Estimate();
            }


            //считаем фитнесс для детей
            for (int i = 0; i < children.Length; i++)
            {
                FitnessCalc(children[i], childrenResults[i]);
            }

            //Формирование нового поколения
            wholePopulation = new Inputs[dataContext.GAParams.PCount + dataContext.GAParams.ChildrenCount];
            wholePopResults = new Results[dataContext.GAParams.PCount + dataContext.GAParams.ChildrenCount];
            NewGeneration();

            //Сортировка по фитнессу
            FitnessSort();
            dataContext.GAmodel.BestFitness = wholePopResults[0].Fitness;


            //умерщвление самых слабых
            //wholePopResults[0].Fitness = 0;
            population = new Inputs[dataContext.GAParams.PCount];
            popResults = new Results[dataContext.GAParams.PCount];
            Array.Copy(wholePopulation, population, dataContext.GAParams.PCount);
            Array.Copy(wholePopResults, popResults, dataContext.GAParams.PCount);


            int same = 0;

            for (int i = 1; i < dataContext.GAParams.PCount / 5 + 1; i++)
            {
                if (popResults[i].Fitness == popResults[i - 1].Fitness)
                {
                    same++;
                }
            }

            //проверка условий остановки
            if ((generationCounter >= dataContext.GAParams.Generations) || (same >= dataContext.GAParams.PCount / 5))
            {
                stop = true;
            }
        }