示例#1
0
 public void InvertedGenerationalDistanceTestEmptyFront()
 {
     double[] point = new double[2];
     point[0] = 0.5;
     point[1] = 0.5;
     double[][] front          = { };
     double[][] referencefront = { point };
     InvertedGenerationalDistance.Calculate(front, referencefront, 1);
 }
示例#2
0
        public void InvertedGenerationalDistanceTestSinglePoint()
        {
            double[] point = new double[2];
            point[0] = 0;
            point[1] = 0;
            double[][] front  = { point };
            double[]   point2 = new double[2];
            point2[0] = 1;
            point2[1] = 1;
            double[][] referencefront = { point2 };
            double     dist           = InvertedGenerationalDistance.Calculate(front, referencefront, 1);

            Assert.AreEqual(Math.Sqrt(2), dist);
        }
        private void Analyze()
        {
            ResultsScatterPlot = new ParetoFrontScatterPlot(solutions.Select(x => x.Fitness).ToArray(), solutions.Select(x => x.Mean.ToArray()).ToArray(), ResultsScatterPlot.ParetoFront, ResultsScatterPlot.Objectives, ResultsScatterPlot.ProblemSize);
            ResultsSolutions   = solutions.Select(x => x.Mean.ToArray()).ToMatrix();

            var problem = Problem as MultiObjectiveTestFunctionProblem;

            if (problem == null)
            {
                return;
            }

            var front = NonDominatedSelect.GetDominatingVectors(solutions.Select(x => x.Fitness), problem.ReferencePoint.CloneAsArray(), Problem.Maximization, true).ToArray();

            if (front.Length == 0)
            {
                return;
            }
            var bounds = problem.Bounds.CloneAsMatrix();

            ResultsCrowding             = Crowding.Calculate(front, bounds);
            ResultsSpacing              = Spacing.Calculate(front);
            ResultsGenerationalDistance = problem.BestKnownFront != null?GenerationalDistance.Calculate(front, problem.BestKnownFront.ToJaggedArray(), 1) : double.NaN;

            ResultsInvertedGenerationalDistance = problem.BestKnownFront != null?InvertedGenerationalDistance.Calculate(front, problem.BestKnownFront.ToJaggedArray(), 1) : double.NaN;

            ResultsHypervolume     = Hypervolume.Calculate(front, problem.ReferencePoint.CloneAsArray(), Problem.Maximization);
            ResultsBestHypervolume = Math.Max(ResultsHypervolume, ResultsBestHypervolume);
            ResultsDifferenceBestKnownHypervolume = ResultsBestKnownHypervolume - ResultsBestHypervolume;

            ResultsBestHypervolumeDataLine.Values.Add(ResultsBestHypervolume);
            ResultsHypervolumeDataLine.Values.Add(ResultsHypervolume);
            ResultsCrowdingDataLine.Values.Add(ResultsCrowding);
            ResultsGenerationalDistanceDataLine.Values.Add(ResultsGenerationalDistance);
            ResultsInvertedGenerationalDistanceDataLine.Values.Add(ResultsInvertedGenerationalDistance);
            ResultsSpacingDataLine.Values.Add(ResultsSpacing);
            ResultsHypervolumeDifferenceDataLine.Values.Add(ResultsDifferenceBestKnownHypervolume);

            Problem.Analyze(
                solutions.Select(x => (Optimization.Individual) new SingleEncodingIndividual(Problem.Encoding, new Scope {
                Variables = { new Variable(Problem.Encoding.Name, x.Mean) }
            })).ToArray(),
                solutions.Select(x => x.Fitness).ToArray(),
                Results,
                random);
        }
示例#4
0
        public void InvertedGenerationalDistanceTestDifferentSizes()
        {
            double[] point = new double[2];
            point[0] = 0;
            point[1] = 0;
            double[] point1 = new double[2];
            point1[0] = 1;
            point1[1] = 0.5;
            double[][] front  = { point, point1 };
            double[]   point2 = new double[2];
            point2[0] = 1;
            point2[1] = 0;
            double[][] referencefront = { point2 };
            double     dist           = InvertedGenerationalDistance.Calculate(front, referencefront, 1);

            Assert.AreEqual(0.5, dist);
        }
示例#5
0
        public void InvertedGenerationalDistanceTestQuadratic()
        {
            double[] point = new double[2];
            point[0] = 0;
            point[1] = 0;
            double[] point1 = new double[2];
            point1[0] = 0;
            point1[1] = 1;
            double[][] front  = { point, point1 };
            double[]   point2 = new double[2];
            point2[0] = 1;
            point2[1] = 0;
            double[] point3 = new double[2];
            point3[0] = 1;
            point3[1] = 1;
            double[][] referencefront = { point2, point3 };
            double     dist           = InvertedGenerationalDistance.Calculate(front, referencefront, 1);

            Assert.AreEqual(1, dist);
        }
示例#6
0
        public IDictionary <string, IDictionary <string, IDictionary <string, List <double> > > > GetIndicators()
        {
            GenerateReferenceParetoFronts();

            var         indicators = new Dictionary <string, IDictionary <string, IDictionary <string, List <double> > > >();
            MetricsUtil utils      = new MetricsUtil();

            for (int i = 0, li = experiment.QualityIndicators.Count; i < li; i++)
            {
                string indicatorString = experiment.QualityIndicators[i].ToUpper();
                double value           = 0;

                var problems = new Dictionary <string, IDictionary <string, List <double> > >();
                indicators.Add(indicatorString, problems);

                foreach (var problem in experiment.ExperimentProblems)
                {
                    var algorithm = new Dictionary <string, List <double> >();
                    problems.Add(problem.Alias, algorithm);

                    var trueFront = utils.ReadFront(problem.ParetoFront);

                    foreach (var algorithmDictionary in problem.AlgorithmDictionary)
                    {
                        var indicator = new List <double>();

                        algorithm.Add(algorithmDictionary.Key, indicator);

                        foreach (var alg in algorithmDictionary.Value)
                        {
                            var solutionFront = alg.Result.GetObjectives();

                            switch (indicatorString)
                            {
                            case "HV":
                                HyperVolume hv = new HyperVolume();
                                value = hv.Hypervolume(solutionFront, trueFront, trueFront[0].Length);
                                break;

                            case "SPREAD":
                                Spread spread = new Spread();
                                value = spread.CalculateSpread(solutionFront, trueFront, trueFront[0].Length);
                                break;

                            case "IGD":
                                InvertedGenerationalDistance igd = new InvertedGenerationalDistance();
                                value = igd.CalculateInvertedGenerationalDistance(solutionFront, trueFront, trueFront[0].Length);
                                break;

                            case "EPSILON":
                                Epsilon epsilon = new Epsilon();
                                value = epsilon.CalcualteEpsilon(solutionFront, trueFront, trueFront[0].Length);
                                break;
                            }

                            indicator.Add(value);
                        }
                    }
                }
            }
            return(indicators);
        }