Example #1
0
        public void FastHypervolumeTestRandomSinglePoint()
        {
            //Front with a single Point
            double[] point = new double[3];
            var      r     = new System.Random();

            point[0] = r.NextDouble();
            point[1] = r.NextDouble();
            point[2] = r.NextDouble();
            double[][] front = { point };

            double[] referencePoint = new double[3];

            //Northeast
            referencePoint[0] = 1;
            referencePoint[1] = 1;
            referencePoint[2] = 1;
            double hv  = Hypervolume.Calculate(front, referencePoint, new bool[3]);
            double hv2 = 1;

            foreach (double d in point)
            {
                hv2 *= Math.Abs(d - 1);
            }
            Assert.AreEqual(hv2, hv);
        }
Example #2
0
        public void FastHypervolumeTestSinglePoint()
        {
            double[]   point          = new double[] { 0.5, 0.5, 0.5 };
            double[][] front          = { point };
            double[]   referencePoint = new double[] { 1, 1, 1 };
            double     hv             = Hypervolume.Calculate(front, referencePoint, new bool[3]);

            Assert.AreEqual(0.125, hv);
        }
        private static double Contribution(IList <double[]> front, int idx, bool[] maximization, double[] refPoint)
        {
            var point = front[idx];

            front.RemoveAt(idx);
            var contribution = -Hypervolume.Calculate(front.ToArray(), refPoint, maximization);

            front.Insert(idx, point);
            return(contribution);
        }
Example #4
0
        public void FastHypervolumeTestDiagonalPoint()
        {
            //Front with three points
            double[]   point1 = new double[] { 1, 0, 0 };
            double[]   point2 = new double[] { 0, 1, 0 };
            double[]   point3 = new double[] { 0.5, 0.5, 0 };
            double[][] front  = { point1, point2, point3 };

            double[] referencePoint = new double[] { 1, 1, 1 };
            double   hv             = Hypervolume.Calculate(front, referencePoint, new bool[3]);

            Assert.AreEqual(0.5, hv);
        }
        public void HypervolumeTestDiagonalPoint()
        {
            //Front with three points
            double[] point1 = new double[2];
            point1[0] = 0;
            point1[1] = 1;
            double[] point2 = new double[2];
            point2[0] = 1;
            point2[1] = 0;
            double[] point3 = new double[2];
            point3[0] = 0.5;
            point3[1] = 0.5;
            double[][] front = { point1, point2, point3 };

            double[] referencePoint = new double[2];
            bool[]   maximization;

            //Northeast
            maximization      = new bool[] { false, false };
            referencePoint[0] = 1;
            referencePoint[1] = 1;
            double ne = Hypervolume.Calculate(front, referencePoint, maximization);

            Assert.AreEqual(0.25, ne);

            //NorthWest
            maximization      = new bool[] { true, false };
            referencePoint[0] = 0;
            referencePoint[1] = 1;
            double nw = Hypervolume.Calculate(NonDominatedSelect.SelectNonDominatedVectors(front, maximization, true), referencePoint, maximization);

            Assert.AreEqual(1, nw);

            //SouthWest
            maximization      = new bool[] { true, true };
            referencePoint[0] = 0;
            referencePoint[1] = 0;
            double sw = Hypervolume.Calculate(front, referencePoint, maximization);

            Assert.AreEqual(0.25, sw);

            //SouthEast
            maximization      = new bool[] { false, true };
            referencePoint[0] = 1;
            referencePoint[1] = 0;
            double se = Hypervolume.Calculate(NonDominatedSelect.SelectNonDominatedVectors(front, maximization, true), referencePoint, maximization);

            Assert.AreEqual(1, se);
        }
        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);
        }
        public void HypervolumeTestReferencePointViolationNE()
        {
            //Front with a single Point
            double[] point = new double[2];
            point[0] = 0.5;
            point[1] = 0.5;
            double[][] front = { point };

            double[] referencePoint = new double[2];
            bool[]   maximization;

            //Northeast
            maximization      = new bool[] { true, true };
            referencePoint[0] = 1;
            referencePoint[1] = 1;
            double ne = Hypervolume.Calculate(front, referencePoint, maximization);
        }
        public void HypervolumeTestSinglePoint()
        {
            //Front with a single Point
            double[] point = new double[2];
            point[0] = 0.5;
            point[1] = 0.5;
            double[][] front = { point };

            double[] referencePoint = new double[2];
            bool[]   maximization;

            //Northeast
            maximization      = new bool[] { false, false };
            referencePoint[0] = 1;
            referencePoint[1] = 1;
            double ne = Hypervolume.Calculate(front, referencePoint, maximization);

            Assert.AreEqual(0.25, ne);

            //NorthWest
            maximization      = new bool[] { true, false };
            referencePoint[0] = 0;
            referencePoint[1] = 1;
            double nw = Hypervolume.Calculate(front, referencePoint, maximization);

            Assert.AreEqual(0.25, nw);

            //SouthWest
            maximization      = new bool[] { true, true };
            referencePoint[0] = 0;
            referencePoint[1] = 0;
            double sw = Hypervolume.Calculate(front, referencePoint, maximization);

            Assert.AreEqual(0.25, sw);

            //SouthEast
            maximization      = new bool[] { false, true };
            referencePoint[0] = 1;
            referencePoint[1] = 0;
            double se = Hypervolume.Calculate(front, referencePoint, maximization);

            Assert.AreEqual(0.25, se);
        }
        public void HypervolumeTestReferencePointViolationSE()
        {
            //Front with a single Point
            double[] point = new double[2];
            point[0] = 0.5;
            point[1] = 0.5;
            double[][] front = { point };

            double[] referencePoint = new double[2];
            bool[]   maximization;

            //SouthEast
            maximization      = new bool[] { true, false };
            referencePoint[0] = 1;
            referencePoint[1] = 0;
            double se = Hypervolume.Calculate(front, referencePoint, maximization);

            Assert.AreEqual(0.25, se);
        }
        public void HypervolumeTestReferencePointViolationNW()
        {
            //Front with a single Point
            double[] point = new double[2];
            point[0] = 0.5;
            point[1] = 0.5;
            double[][] front = { point };

            double[] referencePoint = new double[2];
            bool[]   maximization;

            //NorthWest
            maximization      = new bool[] { false, true };
            referencePoint[0] = 0;
            referencePoint[1] = 1;
            double nw = Hypervolume.Calculate(front, referencePoint, maximization);

            Assert.AreEqual(0.25, nw);
        }
        private void InitResults()
        {
            Results.Add(new Result(IterationsResultName, "The number of gererations evaluated", new IntValue(0)));
            Results.Add(new Result(EvaluationsResultName, "The number of function evaltions performed", new IntValue(0)));
            Results.Add(new Result(HypervolumeResultName, "The hypervolume of the current front considering the Referencepoint defined in the Problem", new DoubleValue(0.0)));
            Results.Add(new Result(BestHypervolumeResultName, "The best hypervolume of the current run considering the Referencepoint defined in the Problem", new DoubleValue(0.0)));
            Results.Add(new Result(BestKnownHypervolumeResultName, "The best knwon hypervolume considering the Referencepoint defined in the Problem", new DoubleValue(double.NaN)));
            Results.Add(new Result(DifferenceToBestKnownHypervolumeResultName, "The difference between the current and the best known hypervolume", new DoubleValue(double.NaN)));
            Results.Add(new Result(GenerationalDistanceResultName, "The generational distance to an optimal pareto front defined in the Problem", new DoubleValue(double.NaN)));
            Results.Add(new Result(InvertedGenerationalDistanceResultName, "The inverted generational distance to an optimal pareto front defined in the Problem", new DoubleValue(double.NaN)));
            Results.Add(new Result(CrowdingResultName, "The average crowding value for the current front (excluding infinities)", new DoubleValue(0.0)));
            Results.Add(new Result(SpacingResultName, "The spacing for the current front (excluding infinities)", new DoubleValue(0.0)));

            var table = new DataTable("QualityIndicators");

            table.Rows.Add(new DataRow(BestHypervolumeResultName));
            table.Rows.Add(new DataRow(HypervolumeResultName));
            table.Rows.Add(new DataRow(CrowdingResultName));
            table.Rows.Add(new DataRow(GenerationalDistanceResultName));
            table.Rows.Add(new DataRow(InvertedGenerationalDistanceResultName));
            table.Rows.Add(new DataRow(DifferenceToBestKnownHypervolumeResultName));
            table.Rows.Add(new DataRow(SpacingResultName));
            Results.Add(new Result(TimetableResultName, "Different quality meassures in a timeseries", table));
            Results.Add(new Result(CurrentFrontResultName, "The current front", new DoubleMatrix()));
            Results.Add(new Result(ScatterPlotResultName, "A scatterplot displaying the evaluated solutions and (if available) the analytically optimal front", new ParetoFrontScatterPlot()));

            var problem = Problem as MultiObjectiveTestFunctionProblem;

            if (problem == null)
            {
                return;
            }
            if (problem.BestKnownFront != null)
            {
                ResultsBestKnownHypervolume           = Hypervolume.Calculate(problem.BestKnownFront.ToJaggedArray(), problem.TestFunction.ReferencePoint(problem.Objectives), Problem.Maximization);
                ResultsDifferenceBestKnownHypervolume = ResultsBestKnownHypervolume;
            }
            ResultsScatterPlot = new ParetoFrontScatterPlot(new double[0][], new double[0][], problem.BestKnownFront.ToJaggedArray(), problem.Objectives, problem.ProblemSize);
        }
        public void HypervolumeTestRandomSinglePoint()
        {
            //Front with a single Point
            double[] point = new double[2];
            var      r     = new System.Random();

            point[0] = r.NextDouble();
            point[1] = r.NextDouble();
            double[][] front = { point };

            double[] referencePoint = new double[2];
            bool[]   maximization;

            //Northeast
            maximization      = new bool[] { false, false };
            referencePoint[0] = 1;
            referencePoint[1] = 1;
            double ne = Hypervolume.Calculate(front, referencePoint, maximization);

            //NorthWest
            maximization      = new bool[] { true, false };
            referencePoint[0] = 0;
            referencePoint[1] = 1;
            double nw = Hypervolume.Calculate(front, referencePoint, maximization);

            //SouthWest
            maximization      = new bool[] { true, true };
            referencePoint[0] = 0;
            referencePoint[1] = 0;
            double sw = Hypervolume.Calculate(front, referencePoint, maximization);

            //SouthEast
            maximization      = new bool[] { false, true };
            referencePoint[0] = 1;
            referencePoint[1] = 0;
            double se = Hypervolume.Calculate(front, referencePoint, maximization);

            Assert.AreEqual(1.0, ne + se + nw + sw, 1e8);
        }