public void GetSolutionReport_UsingEmptyConstructor() { var dhs = new DownHillSimplex(); dhs.InitialGuess = new[] {1d, 7d}; IVertex initialVertex = new Vertex(dhs.InitialGuess); dhs.InitialSimplex = new Simplex(initialVertex); dhs.CurrentSimplex = dhs.InitialSimplex; dhs.ObjectiveFunction = vertex => ObjectiveMeasure.SumOfSquares(vertex); if (!dhs.IsValid()) { throw new Exception("Did not pass the IsValid method"); } var solution = dhs.GetSolution(); var isSolved = solution.ObjectiveMeasure.IsEqualTo(0d); Assert.IsTrue(isSolved); }
public void GetSolutionReport_UsingInitialParamsConstructor() { Func<IVertex, double> objFunction = vert => { var x = vert.Parameters[0]; var y = vert.Parameters[1]; return (x*x + y - 11)*(x*x + y - 11) + (x + y*y - 7)*(x + y*y - 7); }; var initialGuess = new[] { 1.0, 1.0 }; var dhs = new DownHillSimplex(initialGuess); dhs.ObjectiveFunction = objFunction; if (!dhs.IsValid()) { throw new Exception("Did not pass the IsValid method"); } var solution = dhs.GetSolution(); Assert.AreEqual(1.6368619236455376E-24, solution.ObjectiveMeasure); }
static void Main() { // Set up a some initial parameters var initialParameterSet = new double[NumDimensions]; var rng = new Random(3); foreach (var i in Enumerable.Range(0, initialParameterSet.Length)) { initialParameterSet[i] = rng.Next(-10, 10); } // Create a downhill simplex object and change a few of the default settings. var dhs = new DownHillSimplex(initialParameterSet); dhs.MinNumberOfIterations = 10; dhs.MaxNumberOfIterations = 10000; dhs.ObjectiveMeasureTolerance = 0.000001; // Create and assign an objective function. This needs to have an output minimum of 0 E.g. like a sum of squares type function Func<IVertex, double> objFunctionRosenbrock = vert => { var sum = 0.0; for (int i = 0; i < vert.Parameters.Length - 1; i++) { sum += (1 - vert.Parameters[i]) * (1 - vert.Parameters[i]) + 100 * (vert.Parameters[i + 1] - vert.Parameters[i] * vert.Parameters[i]) * (vert.Parameters[i + 1] - vert.Parameters[i] * vert.Parameters[i]); } return sum; }; dhs.ObjectiveFunction = objFunctionRosenbrock; // Setting this to true will generate all the path data // E.g. At each step you can see the current parameters, the objectives measures and the type of transformation // from either of Reflection, Contraction or Reduction. Note that the transformation info is lagged so if iteration 61 says // Reflection then it means iteration 62 has been reflected and not iteration 61. dhs.SaveDebugSimplexPathDataToSolutionReport = CreatePathDataForDebugging; // Run the method var stopWatch = new System.Diagnostics.Stopwatch(); stopWatch.Start(); var solution = dhs.GetSolution(); stopWatch.Stop(); // Format string together the output string paramSet; string initialParamSet; try { paramSet = solution.ParameterSet.Aggregate(string.Empty, (current, p) => current + (Math.Round(p, 4) + "; ")); initialParamSet = initialParameterSet.Aggregate(string.Empty, (current, p) => current + (Math.Round(p, 4) + "; ")); } catch(Exception) { paramSet = string.Empty; initialParamSet = string.Empty; } // Print the output Console.WriteLine("Unit tested code:"); Console.WriteLine("Initial Params: {0}", initialParamSet); Console.WriteLine("Run status: {0}\nNumber of iterations: {1}\nObjective measure: {2}\nSolution parameters: {3}", solution.Status, solution.NumOfIterationsMade, Math.Round(solution.ObjectiveMeasure,4), paramSet); Console.WriteLine("Time taken (ms): {0}", stopWatch.ElapsedMilliseconds); // Information for debugging #region If CreatePathDataForDebugging is set to true then the following code block will be run if (dhs.SaveDebugSimplexPathDataToSolutionReport) { for (int i = 0; i < solution.NumOfIterationsMade; i++) { if (i % PathIntervalToBeDisplayedWhenDebugging != 0) { continue; } var measures = string.Empty; var vertices = "("; for (int j = 0; j <= solution.ParameterSet.Length; j++) { measures += Math.Round(solution.ObjectiveMeasuresPath[i][j],4) + "; "; vertices = solution.SimplexPath[i].Vertices[j + 1].Parameters.Aggregate(vertices, (current, p) => current + (Math.Round(p,4) + " ")); vertices += "/ "; } vertices += ")"; Console.WriteLine("Iteration Number: {0}", i); Console.WriteLine("Transformation type: {0}", solution.SimplexTransformationPath[i + 1]); Console.WriteLine("Measures: {0}", measures); Console.WriteLine("Vertices: {0}", vertices); } } #endregion Console.ReadLine(); }