2014-12-01 68 views
0

我目前正試圖在java中使用apache庫實現一個無派生多變量優化。但是,我無法向optimize()方法提供所需的「OptimizationData」。下面是我迄今爲止運行我的優化。問題使用apache commons optimize()in java

public static double[] Optimize(double[][] contractDataMatrix, double[] modelData,String modelType,String weightType){ 
    ObjectiveFunction objective = new  
ObjectiveFunction(contractDataMatrix,modelType,weightType); 

    org.apache.commons.math3.optim.nonlinear.scalar.noderiv.SimplexOptimizer optimizer =new 
org.apache.commons.math3.optim.nonlinear.scalar.noderiv.SimplexOptimizer(.01,.001); 
    org.apache.commons.math3.optim.nonlinear.scalar.ObjectiveFunction obj = new  
org.apache.commons.math3.optim.nonlinear.scalar.ObjectiveFunction(objective); 



    org.apache.commons.math3.optim.PointValuePair finalData=optimizer.optimize(
    new org.apache.commons.math3.optim.MaxEval(200), 
    obj, 
    GoalType.MINIMIZE, 
    new InitialGuess(modelData) 
    ); 

    return finalData.getPoint(); 

} 

首先創建一個ObjectiveFunction,這是I類作爲其擴展apache的ObjectiveFunction類的包裝製成。我這樣做是因爲目標函數本身是幾個參數的函數,這些參數對我的問題沒有意義。然後我構造了一個SimplexOptimizer,並嘗試按照我在網上找到的示例調用optimize()。雖然文檔沒有清楚地說明需要什麼作爲輸入,但我相信我已經提供了所有必要的論據,並在下面的編輯中討論了一個可能的例外。不管怎麼說,我收到以下錯誤:

Exception in thread "main" org.apache.commons.math3.exception.NullArgumentException: null is not  allowed 
at org.apache.commons.math3.optim.nonlinear.scalar.noderiv.SimplexOptimizer.checkParameters(SimplexOptimizer.java:214) 
at org.apache.commons.math3.optim.nonlinear.scalar.noderiv.SimplexOptimizer.doOptimize(SimplexOptimizer.java:128) 
at org.apache.commons.math3.optim.nonlinear.scalar.noderiv.SimplexOptimizer.doOptimize(SimplexOptimizer.java:89) 
at org.apache.commons.math3.optim.BaseOptimizer.optimize(BaseOptimizer.java:154) 
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 org.apache.commons.math3.optim.nonlinear.scalar.noderiv.SimplexOptimizer.optimize(SimplexOptimizer.java:122) 
at compfin3.CompFin3.Optimize(CompFin3.java:181) 
at compfin3.CompFin3.main(CompFin3.java:118) 
Java Result: 1 

沒有人有任何想法是什麼「空」值這個錯誤指的是,如何我可能會解決這個問題?

最佳,

保羅

編輯: 我相信我已經找到了問題的根源。看起來,作爲我傳遞給優化器的優化數據的一部分,我忘了定義我正在使用的特定AbstractSimplex。不幸的是,文檔中給出的構造函數都沒有實際工作。當我嘗試

org.apache.commons.math3.optim.PointValuePair finalData=optimizer.optimize(
    new org.apache.commons.math3.optim.MaxEval(200), 
    obj, 
    GoalType.MINIMIZE, 
    new InitialGuess(modelData), 
    new org.apache.commons.math3.optim.nonlinear.scalar.noderiv.AbstractSimplex(2) 
    ); 

我得到的編譯錯誤

AbstractSimplex is abstract, cannot be instantiated 

即使這是該類的記錄構造函數之一。

+0

我建議把在答案,將其標記爲「接受」,使類似的問題將來遊客很快就會看到它。 – SnakeDoc 2014-12-01 21:02:47

+0

@SnakeDoc,我會盡快解決問題。但我仍然沒有想出如何正確傳遞AbstractSimplex作爲參數,或者得到任何有關事物準確記錄的建議。 – Paul 2014-12-01 21:05:50

+0

因爲'AbstracSimplex'是抽象的,不能被實例化,所以你可以使用一個已知的類直接繼承它(本身不是抽象的) - 檢查API文檔的選項:https://commons.apache.org /proper/commons-math/javadocs/api-3.1/org/apache/commons/math3/optim/nonlinear/scalar/noderiv/AbstractSimplex.html – ochi 2014-12-01 21:12:05

回答

1

的folllowing代碼解決了我的問題:

public static double[] Optimize(double[][] contractDataMatrix,double[] minData, double[] maxData,double[] modelData,String modelType,String weightType){ 
    ObjectiveFunction objective = new  ObjectiveFunction(contractDataMatrix,modelType,weightType); 

    org.apache.commons.math3.optim.nonlinear.scalar.noderiv.SimplexOptimizer optimizer =new org.apache.commons.math3.optim.nonlinear.scalar.noderiv.SimplexOptimizer(.01,.001); 
    org.apache.commons.math3.optim.nonlinear.scalar.ObjectiveFunction obj = new org.apache.commons.math3.optim.nonlinear.scalar.ObjectiveFunction(objective); 

    int n = modelData.length; 

    org.apache.commons.math3.optim.PointValuePair finalData=optimizer.optimize(
    new org.apache.commons.math3.optim.MaxEval(200), 
    obj, 
    GoalType.MINIMIZE, 
    new InitialGuess(modelData), 
    new org.apache.commons.math3.optim.nonlinear.scalar.noderiv.NelderMeadSimplex(n) 
    ); 

    return finalData.getPoint(); 

}