Apache Commons优化问题

Kam*_*eot 5 java optimization multidimensional-array nonlinear-optimization

我正在尝试用Apache Commons提供的java优化库来解决受约束的非线性267维优化问题.

经过3天的破译,这就是我所拥有的:

public class optimize2 {

public static void main(String []args){

    double[] point = {1.,2.};
    double[] cost = {3., 2.};
    MultivariateFunction function = new MultivariateFunction() {
            public double value(double[] point) {
                    double x = point[0];
                    double y = point[1];
                    return x * y;
            }
    };


    MultivariateOptimizer optimize = new BOBYQAOptimizer(5);
    optimize.optimize(
            new MaxEval(200),
            GoalType.MAXIMIZE,
            new InitialGuess(point),
            new ObjectiveFunction(function),
            new LinearConstraint(cost, Relationship.EQ, 30));
}
Run Code Online (Sandbox Code Playgroud)

}

无论出于何种原因,optimize.optimize()都会抛出空指针错误.也许我只是愚蠢但我无法弄清楚如何使这个工作.

这是错误:

异常线程 "main" 显示java.lang.NullPointerException在org.apache.commons.math3.optim.nonlinear.scalar.noderiv.BOBYQAOptimizer.setup(BOBYQAOptimizer.java:2401)在org.apache.commons.math3.optim.nonlinear .scalar.noderiv.BOBYQAOptimizer.doOptimize(BOBYQAOptimizer.java:236)在org.apache.commons.math3.optim.nonlinear.scalar.noderiv.BOBYQAOptimizer.doOptimize(BOBYQAOptimizer.java:49)在org.apache.commons.math3 .optim.BaseOptimizer.optimize(BaseOptimizer.java:143)在org.apache.commons.math3.optim.BaseMultivariateOptimizer.optimize(BaseMultivariateOptimizer.java:66)在org.apache.commons.math3.optim.nonlinear.scalar.MultivariateOptimizer .optimize(MultivariateOptimizer.java:64)在Test.Code.optimize2.main(optimize2.java:39)

And*_*son 6

直接查看BOBYQA代码,实际上似乎问题是您没有明确定义任何变量边界.第2401行(setup方法)内容如下:

boundDifference[i] = upperBound[i] - lowerBound[i];
Run Code Online (Sandbox Code Playgroud)

在该doOptimze方法中,在调用setup边界之前使用以下方法设置:

final double[] lowerBound = getLowerBound();
final double[] upperBound = getUpperBound();
Run Code Online (Sandbox Code Playgroud)

这些方法在BaseMultivariateOptimizer中定义如下:

public double[] getLowerBound() {
    return lowerBound == null ? null : lowerBound.clone();
}
Run Code Online (Sandbox Code Playgroud)

(并且类似地getUpperBound()).但是lowerBound, 如果调用中的优化数据包含边界信息,则仅upperBoundBaseMultivariateOptimizer中设置optimize.如果未在通话中设置界限optimize,则应收到a NullPointerException.

看看BOBYQA测试代码,如果你在optimize调用中添加以下参数,它似乎就足够了:

SimpleBounds.unbounded(point.length)
Run Code Online (Sandbox Code Playgroud)

话虽如此,我也不认为你能够使用Apache Commons Math中的任何非线性优化器完全解决你的问题,因为据我所知,这些优化器都不能处理线性或非线性约束.我建议你看一下例如Michael Powell的COBYLA2算法.我已将此算法的原始FORTRAN代码迁移到Java,您可以在此处此处找到代码.

  • @InspiredOne*COBYLA2*中的约束应该被公式化,使得每个约束函数都需要是非负的,即**C(x)> = 0**.我认为处理等式约束的可行方法**C = e**是将其表示为具有小容差的平方差,**(Ce)^ 2 <= tol**或重新拟合以适合*COBYLA2*,**tol - (Ce)^ 2> = 0**. (2认同)