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 の org.apache.commons.math3.optim.nonlinear.scalar.noderiv.BOBYQAOptimizer.setup(BOBYQAOptimizer.java:2401) でのスレッド "main" java.lang.NullPointerException での例外.scalar.noderiv.BOBYQAOptimizer.doOptimize(BOBYQAOptimizer.java:236) at org.apache.commons.math3.optim.nonlinear.scalar.noderiv.BOBYQAOptimizer.doOptimize(BOBYQAOptimizer.java:49) at 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)

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())。ただしlowerBoundBaseMultivariateOptimizerは、呼び出しの最適化データに境界情報が含ま れている場合にのみ設定さupperBoundれます。の呼び出しで境界が設定されていない場合は、.optimizeoptimizeNullPointerException

BOBYQA テスト コードを見ると、次の引数をoptimize呼び出しに追加すれば十分なようです。

SimpleBounds.unbounded(point.length)

そうは言っても、 Apache Commons Mathの非線形オプティマイザーを使用して問題を完全に解決できるとは思いません。私が知る限り、これらのオプティマイザーは線形または非線形の制約を処理できないためです。代わりに、たとえば Michael Powell のCOBYLA2アルゴリズムを参照することをお勧めします。このアルゴリズムの元の FORTRAN コードを Java に移行しました。コードはここここにあります。

于 2013-06-07T07:09:26.090 に答える