2014-12-01 69 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(); 

}