Browse Source

Optimization: Finish implementation of Golden Section minimum search

optimization-2
Scott Stephens 13 years ago
committed by Christoph Ruegg
parent
commit
2894f9bb02
  1. 1
      src/Numerics/Numerics.csproj
  2. 2
      src/Numerics/Optimization/ExitCondition.cs
  3. 24
      src/Numerics/Optimization/GoldenSectionMinimizer.cs
  4. 22
      src/Numerics/Optimization/MinimizationOutput1D.cs

1
src/Numerics/Numerics.csproj

@ -203,6 +203,7 @@
<Compile Include="Optimization\LineSearchingMinimizerOutput.cs" />
<Compile Include="Optimization\LineSearchOutput.cs" />
<Compile Include="Optimization\MinimizationOutput.cs" />
<Compile Include="Optimization\MinimizationOutput1D.cs" />
<Compile Include="Optimization\NewtonMinimizer.cs" />
<Compile Include="Optimization\ObjectiveChecker.cs" />
<Compile Include="Optimization\ObjectiveChecker1D.cs" />

2
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 }
}

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

22
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;
}
}
}
Loading…
Cancel
Save