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); }