public List <double> ILVector(OptimizationSolution[] samples, OptimizationSolution best)
        {
            var           length = (samples.Length - 1) * (samples.Length - 2) / 2;
            List <double> result = new List <double>(length);

            for (int i = 0; i < samples.Length; i++)
            {
                if (samples[i].Position.Equals(best.Position))
                {
                    continue;                                //skip the best parameter set
                }
                for (int j = i + 1; j < samples.Length; j++) //only consider solutions in upper half (due to symmetry)
                {
                    if (samples[j].Position.Equals(best.Position))
                    {
                        continue;                                            //skip the best parameter set
                    }
                    if (samples[i].Fitness.CompareTo(samples[j].Fitness) > 0)
                    {
                        result.Add(1);
                    }
                    else if (samples[i].Fitness.CompareTo(samples[j].Fitness) < 0)
                    {
                        result.Add(0);
                    }
                    else
                    {
                        result.Add(0.5);
                    }
                }
            }
            return(result);
        }
        public double SphericalReference(OptimizationSolution solution, OptimizationSolution best)
        {
            double sum = 0;

            for (int i = 0; i < solution.Position.Length; i++)
            {
                double d = solution.Position[i] - best.Position[i];
                sum += d * d;
            }

            return(sum);
        }
        public double Calculate(IEnumerable <OptimizationSolution> solutions, IObjective objective)
        {
            OptimizationSolution[] samples = solutions.ToArray();
            OptimizationSolution   best    = Helpers.GetBest(samples);

            OptimizationSolution[] reference = solutions.Select(x => new OptimizationSolution(x.Position, objective.Evaluate(SphericalReference(x, best)))).ToArray();

            List <double> ilVec    = ILVector(samples, best);   //information landscape of problem
            List <double> ilVecRef = ILVector(reference, best); //information landscape of reference

            return(AbsoluteDistance(ilVec, ilVecRef));
        }
Пример #4
0
        public (double avg, double dev) Calculate(IEnumerable <OptimizationSolution> solutions, double stepSize, Domain problemDomain)
        {
            OptimizationSolution[] solutionArray = solutions.ToArray();
            double[] gradients = new double[solutionArray.Length - 1];

            double fMin = double.PositiveInfinity;
            double fMax = double.NegativeInfinity;

            for (int i = 1; i < solutionArray.Length; i++)
            {
                fMin = Math.Min(fMin, solutionArray[i].Fitness.Value);
                fMax = Math.Max(fMax, solutionArray[i].Fitness.Value);
            }

            double fRange = fMax - fMin;

            double domSum = 0;

            for (int i = 0; i < problemDomain.Dimension; i++)
            {
                domSum += problemDomain[i].Range;
            }

            double gradSum = 0;
            //calculate gradients
            double distTerm = stepSize / domSum;

            for (int i = 1; i < solutionArray.Length; i++)
            {
                OptimizationSolution a = solutionArray[i - 1];
                OptimizationSolution b = solutionArray[i];

                double fitTerm = (b.Fitness.Value - a.Fitness.Value) / fRange;

                gradients[i - 1] = fitTerm / distTerm;

                gradSum += Math.Abs(gradients[i - 1]);
            }

            double avg = gradSum / solutionArray.Length;

            double devSum = 0;

            for (int i = 0; i < gradients.Length; i++)
            {
                devSum += Math.Pow(avg - Math.Abs(gradients[i]), 2);
            }

            double dev = Math.Sqrt(devSum / (solutionArray.Length - 2));

            return(avg, dev);
        }
        public double Calculate(IEnumerable <OptimizationSolution> solutions)
        {
            OptimizationSolution[] samples = solutions.ToArray();
            int numSamples = samples.Length;

            OptimizationSolution best = Helpers.GetBest(samples);

            List <double> fitnesses = new List <double>(numSamples);
            List <double> distances = new List <double>(numSamples);

            double fitnessSum  = 0;
            double distanceSum = 0;

            foreach (var sample in samples)
            {
                fitnessSum += sample.Fitness.Value;
                fitnesses.Add(sample.Fitness.Value);

                double distance = distanceMeasure.Measure(sample.Position, best.Position);
                distanceSum += distance;
                distances.Add(distance);
            }

            double avgFitness  = fitnessSum / numSamples;
            double avgDistance = distanceSum / numSamples;

            double numerator    = 0;
            double lDenominator = 0;
            double rDenominator = 0;

            //calculate the sums used in the final calculation
            for (int i = 0; i < numSamples; i++)
            {
                double fitnessDiff  = fitnesses[i] - avgFitness;
                double distanceDiff = distances[i] - avgDistance;
                numerator += fitnessDiff * distanceDiff;

                lDenominator += fitnessDiff * fitnessDiff;
                rDenominator += distanceDiff * distanceDiff;
            }

            return(numerator / (Math.Sqrt(lDenominator) * Math.Sqrt(rDenominator)));
        }