我目前正試圖在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
即使這是該類的記錄構造函數之一。
我建議把在答案,將其標記爲「接受」,使類似的問題將來遊客很快就會看到它。 – SnakeDoc 2014-12-01 21:02:47
@SnakeDoc,我會盡快解決問題。但我仍然沒有想出如何正確傳遞AbstractSimplex作爲參數,或者得到任何有關事物準確記錄的建議。 – Paul 2014-12-01 21:05:50
因爲'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