Exemplo n.º 1
0
        public override IEnumerable <IndividualBase> Execute()
        {
            //Initialize Population + Evaluate Objective Values
            Population = new Population_MultiObjective_AG(Problem, InitialPopulationSize);
            Population.RandomInitialize();

            // Assign Rank Based on Pareto Dominance
            FastNonDominatedSort(Population);

            // Assign Crowding Distance for the Population
            CrowdingDistanceAssignment(Population.Content);

            // Creates Offspring through Selection, Recombination, and Mutation
            Population_MultiObjective_AG childPopulation = Procreate(Population);

            Population_MultiObjective_AG Pnext = Population;
            Population_MultiObjective_AG Qnext = childPopulation;

            Population_MultiObjective_AG currentGeneration = new Population_MultiObjective_AG(Problem, 2 * InitialPopulationSize);

            currentGeneration.AddPopulation(Pnext);
            currentGeneration.AddPopulation(Qnext);

            for (int idxGeracao = 1; idxGeracao < NumberOfGenerations; ++idxGeracao)
            {
                Pnext = RunGeneration(currentGeneration);
                Qnext = Procreate(Pnext);

                currentGeneration = new Population_MultiObjective_AG(Problem, 2 * InitialPopulationSize);
                currentGeneration.AddPopulation(Pnext);
                currentGeneration.AddPopulation(Qnext);
            }
            return(FastNonDominatedSort(currentGeneration).First().Content);
        }
Exemplo n.º 2
0
        public override IEnumerable<IndividualBase> Execute()
        {
            //Initialize Population + Evaluate Objective Values
            Population = new Population_MultiObjective_AG(Problem, InitialPopulationSize);
            Population.RandomInitialize();

            // Assign Rank Based on Pareto Dominance
            FastNonDominatedSort(Population);

            // Assign Crowding Distance for the Population
            CrowdingDistanceAssignment(Population.Content);

            // Creates Offspring through Selection, Recombination, and Mutation
            Population_MultiObjective_AG childPopulation = Procreate(Population);

            Population_MultiObjective_AG Pnext = Population;
            Population_MultiObjective_AG Qnext = childPopulation;

            Population_MultiObjective_AG currentGeneration = new Population_MultiObjective_AG(Problem, 2 * InitialPopulationSize);
            currentGeneration.AddPopulation(Pnext);
            currentGeneration.AddPopulation(Qnext);

            for (int idxGeracao = 1; idxGeracao < NumberOfGenerations; ++idxGeracao) {
                Pnext = RunGeneration(currentGeneration);
                Qnext = Procreate(Pnext);

                currentGeneration = new Population_MultiObjective_AG(Problem, 2 * InitialPopulationSize);
                currentGeneration.AddPopulation(Pnext);
                currentGeneration.AddPopulation(Qnext);
            }
            return FastNonDominatedSort(currentGeneration).First().Content;
        }
Exemplo n.º 3
0
        protected override Population_MultiObjective_AG RunGeneration(Population_MultiObjective_AG currentGeneration)
        {
            List <Population_MultiObjective_AG> fronts = FastNonDominatedSort(currentGeneration);

            Population_MultiObjective_AG Pnext = new Population_MultiObjective_AG(Problem, InitialPopulationSize);
            int i = 0;

            while ((Pnext.IndividualCount + fronts[i].IndividualCount) < InitialPopulationSize)
            {
                CrowdingDistanceAssignment(fronts[i].Content);
                Pnext.AddPopulation(fronts[i]);
                i++;
            }
            fronts[i].Content.Sort(CrowdedComparison);
            fronts[i].Content.Reverse();
            Pnext.AddRange(fronts[i].Content.Take(InitialPopulationSize - Pnext.IndividualCount));
            return(Pnext);
        }
Exemplo n.º 4
0
        protected override Population_MultiObjective_AG RunGeneration(Population_MultiObjective_AG currentGeneration)
        {
            Population_MultiObjective_AG everyone = new Population_MultiObjective_AG(Problem, InitialPopulationSize + ArchivePopulationSize);
            everyone.AddPopulation(currentGeneration);
            everyone.AddPopulation(Archive);

            #region Fitness Assignment
            // The Strength of an Individual is the Count of those he Dominates
            foreach (IndividualBase individual in everyone.Content) {
                individual.Strength = everyone.Content.Where(I => !I.Equals(individual)).Count(I => individual.Dominates(I));
            }

            // The RawFitness of an Individual is the sum of the strengths of all those who Dominate him
            foreach (IndividualBase individual in everyone.Content) {
                individual.RawFitness = everyone.Content.Where(I => I.Dominates(individual)).Sum(D => D.Strength);
            }

            // The True Fitness is Calculated
            everyone.CalculateSortedDistances();
            int k = (int)Math.Sqrt(InitialPopulationSize + ArchivePopulationSize);
            foreach (IndividualBase i in everyone.Content) {
                double distanceSought = i.DistancesToOtherIndividuals[k].Item2;
                double density = (1 / (distanceSought + 2));
                i.FinalFitness = i.RawFitness + density;
            }
            #endregion

            #region Environment Selection
            Population_MultiObjective_AG nextArchive = new Population_MultiObjective_AG(Problem, ArchivePopulationSize);
            List<IndividualBase> excludeList = new List<IndividualBase>();

            //insere em nextArchive todos os elementos da populacao total com finalFitness < 1
            //poderia ser tambem rawFitness = 0, mas no artigo especifica o dito acima, podemos seguir
            //aproveitar pra remover do total os elementos inseridos, vai facilitar no proximo passo..
            IEnumerable<IndividualBase> nonDominatedSolutions = everyone.Content.Where(I => I.FinalFitness < 1);
            nextArchive.AddRange(nonDominatedSolutions);
            everyone.Content.RemoveAll(I => nonDominatedSolutions.Contains(I));

            if (nextArchive.IndividualCount < ArchivePopulationSize) {
                everyone.Content.Sort(finalFitnessComparison);

                //TODO: Confirmar se é melhor maior ou menor, esse reverse faz pegar os menores
                everyone.Content.Reverse();

                IEnumerable<IndividualBase> complement = everyone.Content.Take(ArchivePopulationSize - nextArchive.IndividualCount);
                nextArchive.AddRange(complement);
            }
            else if(nextArchive.IndividualCount > ArchivePopulationSize) {
                //trunca a população pela distancia
                nextArchive.Truncate(ArchivePopulationSize);
            }

            //acho que não vai precisar do antigo mais.. conferir !
            this.Archive = nextArchive;
            #endregion

            #region Mating Selection
            //Seleção dos Pais da proxima populacao, leva em conta apenas archive
            Population_MultiObjective_AG matingPool = Procreate(nextArchive);
            #endregion

            return matingPool;
        }
Exemplo n.º 5
0
        protected override Population_MultiObjective_AG RunGeneration(Population_MultiObjective_AG currentGeneration)
        {
            List<Population_MultiObjective_AG> fronts = FastNonDominatedSort(currentGeneration);

            Population_MultiObjective_AG Pnext = new Population_MultiObjective_AG(Problem, InitialPopulationSize);
            int i = 0;
            while ((Pnext.IndividualCount + fronts[i].IndividualCount) < InitialPopulationSize) {
                CrowdingDistanceAssignment(fronts[i].Content);
                Pnext.AddPopulation(fronts[i]);
                i++;
            }
            fronts[i].Content.Sort(CrowdedComparison);
            fronts[i].Content.Reverse();
            Pnext.AddRange(fronts[i].Content.Take(InitialPopulationSize - Pnext.IndividualCount));
            return Pnext;
        }
Exemplo n.º 6
0
        protected override Population_MultiObjective_AG RunGeneration(Population_MultiObjective_AG currentGeneration)
        {
            Population_MultiObjective_AG everyone = new Population_MultiObjective_AG(Problem, InitialPopulationSize + ArchivePopulationSize);

            everyone.AddPopulation(currentGeneration);
            everyone.AddPopulation(Archive);

            #region Fitness Assignment
            // The Strength of an Individual is the Count of those he Dominates
            foreach (IndividualBase individual in everyone.Content)
            {
                individual.Strength = everyone.Content.Where(I => !I.Equals(individual)).Count(I => individual.Dominates(I));
            }

            // The RawFitness of an Individual is the sum of the strengths of all those who Dominate him
            foreach (IndividualBase individual in everyone.Content)
            {
                individual.RawFitness = everyone.Content.Where(I => I.Dominates(individual)).Sum(D => D.Strength);
            }

            // The True Fitness is Calculated
            everyone.CalculateSortedDistances();
            int k = (int)Math.Sqrt(InitialPopulationSize + ArchivePopulationSize);
            foreach (IndividualBase i in everyone.Content)
            {
                double distanceSought = i.DistancesToOtherIndividuals[k].Item2;
                double density        = (1 / (distanceSought + 2));
                i.FinalFitness = i.RawFitness + density;
            }
            #endregion

            #region Environment Selection
            Population_MultiObjective_AG nextArchive = new Population_MultiObjective_AG(Problem, ArchivePopulationSize);
            List <IndividualBase>        excludeList = new List <IndividualBase>();

            //insere em nextArchive todos os elementos da populacao total com finalFitness < 1
            //poderia ser tambem rawFitness = 0, mas no artigo especifica o dito acima, podemos seguir
            //aproveitar pra remover do total os elementos inseridos, vai facilitar no proximo passo..
            IEnumerable <IndividualBase> nonDominatedSolutions = everyone.Content.Where(I => I.FinalFitness < 1);
            nextArchive.AddRange(nonDominatedSolutions);
            everyone.Content.RemoveAll(I => nonDominatedSolutions.Contains(I));

            if (nextArchive.IndividualCount < ArchivePopulationSize)
            {
                everyone.Content.Sort(finalFitnessComparison);

                //TODO: Confirmar se é melhor maior ou menor, esse reverse faz pegar os menores
                everyone.Content.Reverse();

                IEnumerable <IndividualBase> complement = everyone.Content.Take(ArchivePopulationSize - nextArchive.IndividualCount);
                nextArchive.AddRange(complement);
            }
            else if (nextArchive.IndividualCount > ArchivePopulationSize)
            {
                //trunca a população pela distancia
                nextArchive.Truncate(ArchivePopulationSize);
            }

            //acho que não vai precisar do antigo mais.. conferir !
            this.Archive = nextArchive;
            #endregion

            #region Mating Selection
            //Seleção dos Pais da proxima populacao, leva em conta apenas archive
            Population_MultiObjective_AG matingPool = Procreate(nextArchive);
            #endregion

            return(matingPool);
        }