コード例 #1
0
        public static Vector GradientDescent(IOptimizationFunction function, Vector x0, bool useGoldenRatio = true,
                                             double epsilon = 10E-6)
        {
            var x = new DenseVector(x0.Count);

            x0.CopyTo(x);

            var iterations = 0;

            var minimalLambda = -1.0;

            for (var i = 0; i < MAX_ITERATIONS; i++)
            {
                double LambdaFunc(double lambda) =>
                function.Function((Vector)(x + lambda * function.ComputeGradient(x)));

                if (useGoldenRatio)
                {
                    var golden = GoldenRatio(POINT, STEP, EPSILON, LambdaFunc);

                    minimalLambda = (golden.Left + golden.Right) / 2;
                }

                x = (DenseVector)(x + minimalLambda * function.ComputeGradient(x));

                iterations = i;
                if (function.ComputeGradient(x).L2Norm() < epsilon)
                {
                    break;
                }
            }
            Console.WriteLine($"Number of iterations: {iterations}");
            return(x);
        }
コード例 #2
0
        public static Vector Box(IOptimizationFunction function, Vector x0, List <Func <Vector, bool> > inequalities,
                                 Vector lowerBounds, Vector upperBounds, int alpha = 2,
                                 double epsilon = EPSILON)
        {
            var centroid = new DenseVector(x0.Count);

            x0.CopyTo(centroid);

            var iterations = 0;

            var simplex = GenerateSimplex(x0, x0, lowerBounds, upperBounds, inequalities);

            for (var j = 0; j < MAX_ITERATIONS; j++)
            {
                simplex  = simplex.OrderByDescending(function.Function).ToList();
                centroid = (DenseVector)GenerateCentroid(simplex);

                var reflected = (Vector)((1 + alpha) * centroid - alpha * simplex[0]);

                for (var i = 0; i < simplex.First().Count; i++)
                {
                    reflected[i] = Math.Min(Math.Max(reflected[i], lowerBounds[i]), upperBounds[i]);
                }

                while (!CheckInequalitiesVector(reflected, inequalities))
                {
                    reflected = (Vector)(0.5 * (reflected + centroid));
                }

                if (function.Function(reflected) > function.Function(simplex[1]))
                {
                    reflected = (Vector)(0.5 * (reflected + centroid));
                }

                simplex[0] = reflected;
                iterations = j;
                if (CalculateStopCondition(simplex, centroid, function.Function) < epsilon)
                {
                    break;
                }
            }
            Console.WriteLine($"Number of iterations: {iterations}");
            return(centroid);
        }