private static void checkParetoRankings(ParetoComparer <MockDualObjective> comparer, MockDualObjective rank_1_a, MockDualObjective rank_1_b, MockDualObjective rank_1_c, MockDualObjective rank_2_a, MockDualObjective rank_2_b, MockDualObjective rank_2_c, MockDualObjective rank_3_a, MockDualObjective rank_3_b)
        {
            Assert.AreEqual(-1, comparer.Compare(rank_1_a, rank_2_a));
            Assert.AreEqual(+1, comparer.Compare(rank_2_a, rank_1_a));

            Assert.AreEqual(-1, comparer.Compare(rank_1_a, rank_3_b));

            Assert.AreEqual(0, comparer.Compare(rank_1_a, rank_1_a));
            Assert.AreEqual(0, comparer.Compare(rank_1_a, rank_1_b));
            Assert.AreEqual(0, comparer.Compare(rank_1_a, rank_1_c));
            Assert.AreEqual(0, comparer.Compare(rank_1_b, rank_1_c));

            MockDualObjective[] scores = new MockDualObjective[] { rank_2_c, rank_1_b, rank_3_b, rank_2_b, rank_1_a, rank_1_c, rank_3_a, rank_2_a };
            ParetoRanking <MockDualObjective> paretoRanking = new ParetoRanking <MockDualObjective>(scores, comparer);

            MockDualObjective[] rank1 = paretoRanking.GetParetoRank(1);
            Assert.AreEqual(3, rank1.Length);
            Assert.IsTrue(rank1.Contains(rank_1_a));
            Assert.IsTrue(rank1.Contains(rank_1_b));
            Assert.IsTrue(rank1.Contains(rank_1_c));
            MockDualObjective[] rank2 = paretoRanking.GetParetoRank(2);
            Assert.AreEqual(3, rank2.Length);
            Assert.IsTrue(rank2.Contains(rank_2_a));
            Assert.IsTrue(rank2.Contains(rank_2_b));
            Assert.IsTrue(rank2.Contains(rank_2_c));
            MockDualObjective[] rank3 = paretoRanking.GetParetoRank(3);
            Assert.AreEqual(2, rank3.Length);
            Assert.IsTrue(rank3.Contains(rank_3_a));
            Assert.IsTrue(rank3.Contains(rank_3_b));
        }
Beispiel #2
0
        private static void checkParetoRankings(ParetoComparer<MockDualObjective> comparer, MockDualObjective rank_1_a, MockDualObjective rank_1_b, MockDualObjective rank_1_c, MockDualObjective rank_2_a, MockDualObjective rank_2_b, MockDualObjective rank_2_c, MockDualObjective rank_3_a, MockDualObjective rank_3_b)
        {
            Assert.AreEqual(-1, comparer.Compare(rank_1_a, rank_2_a));
            Assert.AreEqual(+1, comparer.Compare(rank_2_a, rank_1_a));

            Assert.AreEqual(-1, comparer.Compare(rank_1_a, rank_3_b));

            Assert.AreEqual(0, comparer.Compare(rank_1_a, rank_1_a));
            Assert.AreEqual(0, comparer.Compare(rank_1_a, rank_1_b));
            Assert.AreEqual(0, comparer.Compare(rank_1_a, rank_1_c));
            Assert.AreEqual(0, comparer.Compare(rank_1_b, rank_1_c));

            MockDualObjective[] scores = new MockDualObjective[] { rank_2_c, rank_1_b, rank_3_b, rank_2_b, rank_1_a, rank_1_c, rank_3_a, rank_2_a };
            ParetoRanking<MockDualObjective> paretoRanking = new ParetoRanking<MockDualObjective>(scores, comparer);
            MockDualObjective[] rank1 = paretoRanking.GetParetoRank(1);
            Assert.AreEqual(3, rank1.Length);
            Assert.IsTrue(rank1.Contains(rank_1_a));
            Assert.IsTrue(rank1.Contains(rank_1_b));
            Assert.IsTrue(rank1.Contains(rank_1_c));
            MockDualObjective[] rank2 = paretoRanking.GetParetoRank(2);
            Assert.AreEqual(3, rank2.Length);
            Assert.IsTrue(rank2.Contains(rank_2_a));
            Assert.IsTrue(rank2.Contains(rank_2_b));
            Assert.IsTrue(rank2.Contains(rank_2_c));
            MockDualObjective[] rank3 = paretoRanking.GetParetoRank(3);
            Assert.AreEqual(2, rank3.Length);
            Assert.IsTrue(rank3.Contains(rank_3_a));
            Assert.IsTrue(rank3.Contains(rank_3_b));
        }
        public FitnessAssignedScores <double>[] AssignFitness(IObjectiveScores[] scores)
        {
            var paretoRanking = new ParetoRanking <IObjectiveScores>(scores);

            IObjectiveScores[] nonDominated          = paretoRanking.GetParetoRank(1);
            IObjectiveScores[] dominated             = paretoRanking.GetDominatedByParetoRank(1);
            double[]           fitnessesNonDominated = new double[nonDominated.Length];
            double[]           fitnessesDominated    = new double[dominated.Length];
            for (int j = 0; j < nonDominated.Length; j++)
            {
                fitnessesNonDominated[j] = (double)paretoRanking.GetNumDominated(nonDominated[j], dominated) / scores.Length;
            }
            for (int j = 0; j < dominated.Length; j++)
            {
                double fitness = 1.0;
                for (int k = 0; k < nonDominated.Length; k++)
                {
                    if (paretoRanking.IsDominated(dominated[j], nonDominated[k]))
                    {
                        fitness += fitnessesNonDominated[k];
                    }
                }
                fitnessesDominated[j] = fitness;
            }
            List <double> fitnesses = new List <double>( );

            fitnesses.AddRange(fitnessesNonDominated);
            fitnesses.AddRange(fitnessesDominated);
            List <IObjectiveScores> orderedScores = new List <IObjectiveScores>( );

            orderedScores.AddRange(nonDominated);
            orderedScores.AddRange(dominated);
            FitnessAssignedScores <double>[] result = new FitnessAssignedScores <double> [fitnesses.Count];
            for (int i = 0; i < fitnesses.Count; i++)
            {
                result[i] = new FitnessAssignedScores <double>(orderedScores[i], fitnesses[i]);
            }
            return(result);
        }
        private IObjectiveScores[] getParetoFront(IObjectiveScores[] scores)
        {
            var paretoRanking = new ParetoRanking <IObjectiveScores>(scores, new ParetoComparer <IObjectiveScores>());

            return(paretoRanking.GetParetoRank(1));
        }