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