我目前正试图在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