apachecommons优化问题

jhiyze9q  于 2021-06-30  发布在  Java
关注(0)|答案(1)|浏览(373)

我试图用apachecommons提供的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));
}

}
无论出于何种原因,optimize.optimize()都会引发空指针错误。也许我只是在装傻,但我不知道该怎么做。
错误如下:
org.apache.commons.math3.optim.nonlinear.scalar.noderiv.bobyqapimizer.setup(bobyqapimizer)上的线程“main”java.lang.nullpointerexception中出现异常。java:2401)在org.apache.commons.math3.optim.nonlinear.scalar.noderiv.bobyqapimizer.dooptimize(bobyqapimizer。java:236)在org.apache.commons.math3.optim.nonlinear.scalar.noderiv.bobyqapimizer.dooptimize(bobyqapimizer)。java:49)在org.apache.commons.math3.optim.baseoptimizer.optimize(baseoptimizer。java:143)在org.apache.commons.math3.optim.baseMultivarietOptimizer.optimize(baseMultivarietOptimizer。java:66)在org.apache.commons.math3.optim.nonlinear.scalar.multivarieoptimizer.optimize(multivarieoptimizer。java:64)在test.code.optimize2.main(optimize2。java:39)

yr9zkbsy

yr9zkbsy1#

直接查看bobyqa代码,问题似乎是您没有显式定义任何变量边界。2401线( setup 方法)如下:

boundDifference[i] = upperBound[i] - lowerBound[i];

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

final double[] lowerBound = getLowerBound();
final double[] upperBound = getUpperBound();

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

public double[] getLowerBound() {
    return lowerBound == null ? null : lowerBound.clone();
}

(类似地 getUpperBound() ). 但是 lowerBound 以及 upperBound 在BaseMultivarietOptimizer中,只有在 optimize 调用包含边界信息。如果在调用中未设置边界 optimize 因此,您应该收到 NullPointerException .
看看bobyqa测试代码,如果您将以下参数添加到 optimize 电话:

SimpleBounds.unbounded(point.length)

话虽如此,我也不认为使用apachecommons math中的任何非线性优化器都能完全解决问题,因为据我所知,这些优化器都不能处理线性或非线性约束。我建议您看看michael powell的cobyla2算法。我已经将这个算法的原始fortran代码移植到java中,您可以在这里和这里找到代码。

相关问题