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

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

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

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

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

我还想偶尔使用一些求解器/优化器,对我来说可靠的工作“”例子“的主要来源是”这些类的unit testing ,这些测试通常都是非常精细的,涵盖了许多情况。 例如,关于SimplexOptimizer ,您可能需要查看org/apache/commons/math4/optim/nonlinear/scalar/noderiv/ test情况,其中包含测试类SimplexOptimizerMultiDirectionalTest.javaSimplexOptimizerNelderMeadTest.java

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

编辑

仅供参考,从一个基本unit testing中提取的完整示例:

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