From 2894f9bb02daa9bd7d58d5ffecf1fc875a4f2ef6 Mon Sep 17 00:00:00 2001 From: Scott Stephens Date: Tue, 15 Oct 2013 19:43:20 -0500 Subject: [PATCH] Optimization: Finish implementation of Golden Section minimum search --- src/Numerics/Numerics.csproj | 1 + src/Numerics/Optimization/ExitCondition.cs | 2 +- .../Optimization/GoldenSectionMinimizer.cs | 24 +++++++++++++------ .../Optimization/MinimizationOutput1D.cs | 22 +++++++++++++++++ 4 files changed, 41 insertions(+), 8 deletions(-) create mode 100644 src/Numerics/Optimization/MinimizationOutput1D.cs diff --git a/src/Numerics/Numerics.csproj b/src/Numerics/Numerics.csproj index d9b364b0..dfb48a3a 100644 --- a/src/Numerics/Numerics.csproj +++ b/src/Numerics/Numerics.csproj @@ -203,6 +203,7 @@ + diff --git a/src/Numerics/Optimization/ExitCondition.cs b/src/Numerics/Optimization/ExitCondition.cs index 44477294..e17e14bd 100644 --- a/src/Numerics/Optimization/ExitCondition.cs +++ b/src/Numerics/Optimization/ExitCondition.cs @@ -2,6 +2,6 @@ using System; namespace MathNet.Numerics { - public enum ExitCondition { None, RelativeGradient, LackOfProgress, AbsoluteGradient, WeakWolfeCriteria } + public enum ExitCondition { None, RelativeGradient, LackOfProgress, AbsoluteGradient, WeakWolfeCriteria, BoundTolerance } } diff --git a/src/Numerics/Optimization/GoldenSectionMinimizer.cs b/src/Numerics/Optimization/GoldenSectionMinimizer.cs index 22455350..538610ff 100644 --- a/src/Numerics/Optimization/GoldenSectionMinimizer.cs +++ b/src/Numerics/Optimization/GoldenSectionMinimizer.cs @@ -16,7 +16,7 @@ namespace MathNet.Numerics.Optimization this.MaximumIterations = max_iterations; } - public MinimizationOutput FindMinimum(IObjectiveFunction1D objective, double lower_bound, double upper_bound) + public MinimizationOutput1D FindMinimum(IObjectiveFunction1D objective, double lower_bound, double upper_bound) { if (!(objective is ObjectiveChecker1D)) objective = new ObjectiveChecker1D(objective, this.ValueChecker, null, null); @@ -38,19 +38,29 @@ namespace MathNet.Numerics.Optimization double test_x = lower.Point + (upper.Point - middle.Point); var test = objective.Evaluate(test_x); - if (test.Value > middle.Value) + if (test.Point < middle.Point) { - if (test.Point < middle.Point) + if (test.Value > middle.Value) + { lower = test; + } else - upper = test; + { + upper = middle; + middle = test; + } } else { - if (test.Point < middle.Point) - upper = middle; + if (test.Value > middle.Value) + { + upper = test; + } else + { lower = middle; + middle = test; + } } iterations += 1; @@ -59,7 +69,7 @@ namespace MathNet.Numerics.Optimization if (iterations == this.MaximumIterations) throw new MaximumIterationsException("Max iterations reached."); else - return null; + return new MinimizationOutput1D(middle, iterations, ExitCondition.BoundTolerance); } diff --git a/src/Numerics/Optimization/MinimizationOutput1D.cs b/src/Numerics/Optimization/MinimizationOutput1D.cs new file mode 100644 index 00000000..dd68bbfc --- /dev/null +++ b/src/Numerics/Optimization/MinimizationOutput1D.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace MathNet.Numerics.Optimization +{ + public class MinimizationOutput1D + { + public double MinimizingPoint { get { return FunctionInfoAtMinimum.Point; } } + public IEvaluation1D FunctionInfoAtMinimum { get; private set; } + public int Iterations { get; private set; } + public ExitCondition ReasonForExit { get; private set; } + + public MinimizationOutput1D(IEvaluation1D function_info, int iterations, ExitCondition reason_for_exit) + { + this.FunctionInfoAtMinimum = function_info; + this.Iterations = iterations; + this.ReasonForExit = reason_for_exit; + } + } +}