首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Apache Commons优化问题

Apache Commons优化问题
EN

Stack Overflow用户
提问于 2013-06-06 05:21:53
回答 1查看 3.6K关注 0票数 5

我正在尝试使用Apache Commons提供的java优化库来解决一个有约束的非线性267维优化问题。

经过3天的破译,我得到的是:

代码语言:javascript
复制
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.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的线程"main“java.lang.NullPointerException中出现异常) at org.apache.commons.math3.optim.BaseMultivariateOptimizer.optimize(BaseMultivariateOptimizer.java:66) at org.apache.commons.math3.optim.nonlinear.scalar.MultivariateOptimizer.optimize(MultivariateOptimizer.java:64) at Test.Code.optimize2.main(optimize2.java:39)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-06-07 15:09:26

直接查看BOBYQA code,实际上问题似乎是您没有显式定义任何变量界限。第2401行(setup方法)代码如下:

代码语言:javascript
复制
boundDifference[i] = upperBound[i] - lowerBound[i];

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

代码语言:javascript
复制
final double[] lowerBound = getLowerBound();
final double[] upperBound = getUpperBound();

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

代码语言:javascript
复制
public double[] getLowerBound() {
    return lowerBound == null ? null : lowerBound.clone();
}

(对于getUpperBound()也是如此)。但是只有当optimize调用中的优化数据包含边界信息时,才会设置BaseMultivariateOptimizer中的lowerBoundupperBound。如果在对optimize的调用中没有设置界限,那么您应该收到一个NullPointerException

看一下BOBYQA test code,似乎只要在optimize调用中添加以下参数就足够了:

代码语言:javascript
复制
SimpleBounds.unbounded(point.length)

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

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16950115

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档