如何在java apache数学中使用SimplexSolver或SimplexOptimizer?

hom*_*lad 4 java math optimization apache-commons-math

我正在尝试使用apache commons数学库版本3.5+来解决优化问题.基本上,我正在尝试将(gamma)分布拟合到某些数据点.我似乎无法找到如何使用新的(版本3.5)优化工具(如SimplexSolver,SimplexOptimizer或OptimizationData)来解决一个简单的优化问题的简单示例.

之前已经在这里提出了类似的问题,但所有答案似乎都是针对旧版本的apache数学 - 在3.5版本中进行了重组,并且我找不到任何示例代码.

有没有人有一个工作示例如何使用新的优化器或求解器?我对SimplexOptimizer最感兴趣,但此时任何东西都会有用.

Mar*_*o13 9

实际上,优化器可能很难使用:许多参数,其中不同类型的优化器需要不同的组合,并且它们都隐藏在OptimizationData它们接收的通用阵列中.除非您开始将代码与他们所引用的论文进行匹配,否则您几乎无法获得任何结果.

我还想偶尔使用一些求解器/优化器,对我来说,可靠的,工作""示例"的主要来源是" 这些类的单元测试,这些测试通常都是非常精细的,涵盖了许多情况.例如,关于SimplexOptimizer,您可能希望查看org/apache/commons/math4/optim/nonlinear/scalar/noderiv/包含测试类SimplexOptimizerMultiDirectionalTest.java和的测试用例 SimplexOptimizerNelderMeadTest.java.

(对不起,也许这不是你所期望或希望的,但是......当我试图弄清楚OptimizationData这些优化器实际需要哪些时,我发现这些测试非常有帮助...)

编辑

仅供参考,从一个基本单元测试中提取的完整示例:

import java.util.Arrays;

import org.apache.commons.math3.analysis.MultivariateFunction;
import org.apache.commons.math3.optim.InitialGuess;
import org.apache.commons.math3.optim.MaxEval;
import org.apache.commons.math3.optim.PointValuePair;
import org.apache.commons.math3.optim.nonlinear.scalar.GoalType;
import org.apache.commons.math3.optim.nonlinear.scalar.ObjectiveFunction;
import org.apache.commons.math3.optim.nonlinear.scalar.noderiv.NelderMeadSimplex;
import org.apache.commons.math3.optim.nonlinear.scalar.noderiv.SimplexOptimizer;
import org.apache.commons.math3.util.FastMath;

public class SimplexOptimizerExample
{
    public static void main(String[] args)
    {
        SimplexOptimizer optimizer = new SimplexOptimizer(1e-10, 1e-30);
        final FourExtrema fourExtrema = new FourExtrema();

        final PointValuePair optimum =
            optimizer.optimize(
                new MaxEval(100), 
                new ObjectiveFunction(fourExtrema), 
                GoalType.MINIMIZE, 
                new InitialGuess(new double[]{ -3, 0 }), 
                new NelderMeadSimplex(new double[]{ 0.2, 0.2 }));

        System.out.println(Arrays.toString(optimum.getPoint()) + " : "
            + optimum.getSecond());
    }

    private static class FourExtrema implements MultivariateFunction
    {
        // The following function has 4 local extrema.
        final double xM = -3.841947088256863675365;
        final double yM = -1.391745200270734924416;
        final double xP = 0.2286682237349059125691;
        final double yP = -yM;
        final double valueXmYm = 0.2373295333134216789769; // Local maximum.
        final double valueXmYp = -valueXmYm; // Local minimum.
        final double valueXpYm = -0.7290400707055187115322; // Global minimum.
        final double valueXpYp = -valueXpYm; // Global maximum.

        public double value(double[] variables)
        {
            final double x = variables[0];
            final double y = variables[1];
            return (x == 0 || y == 0) ? 0 : FastMath.atan(x)
                * FastMath.atan(x + 2) * FastMath.atan(y) * FastMath.atan(y)
                / (x * y);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)