public ColumnVector fitnessHistory; // [vector<double>] /// <summary> /// /// </summary> /// <param name="params_"></param> /// <param name="m"></param> /// <param name="sigma_"></param> public CMAState(CMAParams params_, ColumnVector m, double sigma_) { p = params_; C = new SquareMatrix(p.N); B = new SquareMatrix(p.N); d = new double[p.N]; pc = new double[p.N]; ps = new double[p.N]; mean = m; sigma = sigma_; gen = 0; fitnessHistory = new ColumnVector(3); double trace = p.InitialStdDevs.Sum(x => x * x); /* Initialize covariance structure */ for (int i = 0; i < p.N; ++i) { B[i, i] = 1.0; d[i] = p.InitialStdDevs[i] * Math.Sqrt(p.N / trace); C[i, i] = d[i] * d[i]; pc[i] = 0.0; ps[i] = 0.0; } }
/// <summary> /// http://eodev.sourceforge.net/eo/doc/html/_c_m_a_state_8cpp_source.html /// </summary> public CmaEs( Func <double[], object, double> fitnessMinimizationFunction, double[] initialParameters, object userData = null, double[] minimumStandardDeviations = null, double[] initialStandardDeviations = null, double stopFitnessMinimization = 1e-10, int additionalPopulationSize = 0, int maxRestarts = 100, double stopEvalsMultiple = 50.0, double restartPopulationMultiple = 2.0, double initialVarianceEstimates = 0.5, double recombinationRatio = 0.5, double objectiveFunctionTolerance = 1e-12, double standardDeviationToleranceMultiple = 1e-12) { int dimensions = initialParameters.Length; if (recombinationRatio <= 0) { recombinationRatio = 0.5; } if (minimumStandardDeviations == null) { minimumStandardDeviations = new double[dimensions]; for (int i = 0; i < dimensions; i++) { minimumStandardDeviations[i] = DEFAULT_MIN_STDDEV; } } if (initialStandardDeviations == null) { initialStandardDeviations = new double[dimensions]; for (int i = 0; i < dimensions; i++) { initialStandardDeviations[i] = DEFAULT_INITIAL_STDDEV; } } int lambda = 4 + additionalPopulationSize + (int)(3.0 * Math.Log((double)dimensions)); if (lambda > MAX_POPULATIONSIZE) { lambda = MAX_POPULATIONSIZE; } int mu = (int)Math.Floor(lambda * recombinationRatio); this.StopEvals = 100 + (int)(stopEvalsMultiple * Math.Pow(dimensions + 3, 2) / Math.Sqrt(lambda)); this.ObjectiveFunction = fitnessMinimizationFunction; this.InitialParameters = initialParameters; this.UserData = userData; this.StopFitnessMinimization = stopFitnessMinimization; this.MaxRestarts = maxRestarts; this.InitialVarianceEstimate = initialVarianceEstimates; this.RecombinationRatio = recombinationRatio; this.RestartPopulationMultiple = restartPopulationMultiple; this.ObjectiveFunctionTolerance = objectiveFunctionTolerance; this.StandardDeviationToleranceMultiple = standardDeviationToleranceMultiple; _initialCmaParams = new CMAParams( dimensions, MAX_GEN, lambda, mu, minimumStandardDeviations, initialStandardDeviations, CMAParams.WeightType.Logarithmic); }