public static void SolveSecondMultidimensionalVariant(int dimentions) { var solverParams = new CompactQuasiNewtonSolverParams(); var solver = new CompactQuasiNewtonSolver(); int vidRow; int[] vidVariables = new int[dimentions]; //add variables for (int i = 0; i < dimentions; i++) { solver.AddVariable(null, out vidVariables[i]); } //add a row and set it as the goal solver.AddRow(null, out vidRow); solver.AddGoal(vidRow, 0, true); solver.FunctionEvaluator = SecondRosenbrockVariantFunction; solver.GradientEvaluator = SecondRosenbrockVariantGradient; solver.Solve(solverParams); Console.WriteLine("=========Second, more complicated multidimensional variant of Rosenbrock=========="); Console.WriteLine(solver.ToString()); // This variant of Rosenbrock function has a local minima as well // around the point x = -1, 1, 1, .... (first dimension is around -1 and the rest are around 1) // If we start from around this local optima the solver will find and return it, and may not get // to the global optima solver.SetValue(vidVariables[0], -1); for (int i = 1; i < dimentions; i++) { solver.SetValue(vidVariables[i], 1); } //Solve the model solver.Solve(solverParams); Console.WriteLine("=========Second, more complicated multidimensional variant of Rosenbrock, trapped in local Minima=========="); Console.WriteLine(solver.ToString()); }
public static void SolveRosenbrock() { var solverParams = new CompactQuasiNewtonSolverParams(); CompactQuasiNewtonSolver solver = new CompactQuasiNewtonSolver(); int vidRow, vidVariableX, vidVariableY; //add variables solver.AddVariable(key: null, vid: out vidVariableX); solver.AddVariable(key: null, vid: out vidVariableY); //add a row and set it as the goal solver.AddRow(key: null, vid: out vidRow); solver.AddGoal(vid: vidRow, pri: 0, minimize: true); solver.FunctionEvaluator = OriginalRosenbrockFunction; solver.GradientEvaluator = OriginalRosenbrockGradient; solver.Solve(solverParams); Console.WriteLine("=========Original Rosenbrock=========="); Console.WriteLine(solver.ToString()); }
public static void SolveFirstMultidimensionalVariant(int dimentions) { var solverParams = new CompactQuasiNewtonSolverParams(); var solver = new CompactQuasiNewtonSolver(); int vidRow; int[] vidVariables = new int[dimentions]; //add variables for (int i = 0; i < dimentions; i++) { solver.AddVariable(null, out vidVariables[i]); } //add a row and set it as the goal solver.AddRow(null, out vidRow); solver.AddGoal(vidRow, 0, true); // let's try some non-default starting point for (int i = 0; i < dimentions; i++) { solver.SetValue(vidVariables[i], -10); } solver.FunctionEvaluator = FirstRosenbrockVariantFunction; solver.GradientEvaluator = FirstRosenbrockVariantGradient; //Solve the model solver.Solve(solverParams); Console.WriteLine("=========First multidimensional variant of Rosenbrock (many uncoupled 2D Rosenbrock problems)=========="); Console.WriteLine(solver.ToString()); // let's limit the number of iteration to 5 less than actually needed. // We might get close enough answer. solverParams.IterationLimit = solver.IterationCount - 5; // set the starting point again for (int i = 0; i < dimentions; i++) { solver.SetValue(vidVariables[i], -10); } //Solve the model solver.Solve(solverParams); Console.WriteLine("=========First multidimensional variant of Rosenbrock, MaxIteration exceeded=========="); Console.WriteLine(solver.ToString()); }