5

我正在尝试使用 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));
}

}

无论出于何种原因, optimize.optimize() 都会引发空指针错误。也许我只是愚蠢,但我不知道如何让它发挥作用。

这是错误:

org.apache.commons.math3.optim.nonlinear.scalar.noderiv.BOBYQAOptimizer.setup(BOBYQAOptimizer.java:2401) 处 org.apache.commons.math3.optim.nonlinear 的线程“主”java.lang.NullPointerException 中的异常.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) at org.apache.commons.math3.optim.BaseMultivariateOptimizer.optimize(BaseMultivariateOptimizer.java:66) at org.apache.commons.math3.optim.nonlinear.scalar.MultivariateOptimizer .optimize(MultivariateOptimizer.java:64) 在 Test.Code.optimize2.main(optimize2.java:39)

4

1 回答 1

6

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

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

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

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

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

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

(和类似的getUpperBound())。但是只有在调用lowerBound中的优化数据包含边界信息 时才设置BaseMultivariateOptimizer 。如果在对 的调用中没有设置边界,那么您应该会收到一个.upperBoundoptimizeoptimizeNullPointerException

查看BOBYQA 测试代码,如果将以下参数添加到调用中似乎就足够了optimize

SimpleBounds.unbounded(point.length)

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

于 2013-06-07T07:09:26.090 回答