Ejemplo n.º 1
0
        /// <summary>
        /// Construct an initial simplex, given starting guesses for the constants, and
        /// initial step sizes for each dimension
        /// </summary>
        /// <param name="simplexConstants"></param>
        /// <returns></returns>
        private static Vector[] _initializeVertices(SimplexConstant[] simplexConstants)
        {
            int numDimensions = simplexConstants.Length;

            Vector[]             vertices = new Vector[numDimensions + 1];
            GaussianDistribution gaussian;
            // define one point of the simplex as the given initial guesses
            Vector p0 = new Vector(numDimensions);

            for (int i = 0; i < numDimensions; i++)
            {
                gaussian = new GaussianDistribution(simplexConstants[i].Value, simplexConstants[i].InitialPerturbation);
                p0[i]    = gaussian.NextGaussian(simplexConstants[i].Value, simplexConstants[i].InitialPerturbation);
            }

            // now fill in the vertices, creating the additional points as:
            // P(i) = P(0) + Scale(i) * UnitVector(i)
            vertices[0] = p0;
            for (int i = 0; i < numDimensions; i++)
            {
                gaussian = new GaussianDistribution(simplexConstants[i].InitialPerturbation, simplexConstants[i].InitialPerturbation / 2);
                double scale      = simplexConstants[i].InitialPerturbation;
                Vector unitVector = new Vector(numDimensions);
                unitVector[i]   = 1;
                vertices[i + 1] = p0.Add(unitVector.Multiply(gaussian.NextGaussian(simplexConstants[i].InitialPerturbation, simplexConstants[i].InitialPerturbation / 2)));
            }
            return(vertices);
        }