Exemple #1
0
            public bool Dominates(NSGAChromosome other)
            {
                int equalObjectivesCount = 0;

                for (int i = 0; i < _objectiveIndexes.Length; i++)
                {
                    int index = _objectiveIndexes[i];

                    double objective1 = chromosome.Objectives[index];
                    double objective2 = other.chromosome.Objectives[index];

                    if (objective1 < objective2)
                    {
                        return(false);
                    }
                    else if (objective1 == objective2)
                    {
                        equalObjectivesCount++;
                    }
                }

                if (equalObjectivesCount == _objectiveIndexes.Length)
                {
                    return(false);
                }

                return(true);
            }
Exemple #2
0
        private List <List <MOChromosome> > FastNonDominatedSort(List <MOChromosome> chromosomes)
        {
            List <NSGAChromosome> sortingChromosomes = new List <NSGAChromosome> ();

            for (int i = 0; i < chromosomes.Count; i++)
            {
                sortingChromosomes.Add(new NSGAChromosome(chromosomes[i]));
            }

            List <List <NSGAChromosome> > fronts = new List <List <NSGAChromosome> >();

            fronts.Add(new List <NSGAChromosome>());

            for (int i = 0; i < sortingChromosomes.Count; i++)
            {
                NSGAChromosome p = sortingChromosomes[i];

                for (int j = 0; j < sortingChromosomes.Count; j++)
                {
                    NSGAChromosome q = sortingChromosomes[j];

                    if (p.Dominates(q))
                    {
                        p.dominatedChromosomes.Add(q);
                    }
                    else if (q.Dominates(p))
                    {
                        p.dominators++;
                    }
                }

                if (p.dominators == 0)
                {
                    fronts[0].Add(p);
                }
            }

            int currentFrontIndex = 0;
            List <NSGAChromosome> currentFront = fronts[currentFrontIndex];

            while (currentFront.Count > 0)
            {
                List <NSGAChromosome> nextFront = new List <NSGAChromosome>();

                for (int i = 0; i < currentFront.Count; i++)
                {
                    NSGAChromosome p = currentFront[i];

                    for (int j = 0; j < p.dominatedChromosomes.Count; j++)
                    {
                        p.dominatedChromosomes[j].dominators--;

                        if (p.dominatedChromosomes[j].dominators == 0)
                        {
                            nextFront.Add(p.dominatedChromosomes[j]);
                        }
                    }
                }

                fronts.Add(nextFront);

                currentFrontIndex++;
                currentFront = fronts[currentFrontIndex];
            }

            fronts.RemoveAt(fronts.Count - 1);

            List <List <MOChromosome> > finalFronts = new List <List <MOChromosome> > ();

            int finalCount = 0;

            for (int i = 0; i < fronts.Count; i++)
            {
                finalFronts.Add(new List <MOChromosome> ());

                for (int j = 0; j < fronts[i].Count; j++)
                {
                    finalFronts [i].Add(fronts [i] [j].chromosome);
                    finalCount++;
                }
            }

            return(finalFronts);
        }