用java实现非线性不等式约束的非线性优化

时间:2014-12-02 08:28:51

标签: java apache nonlinear-optimization

如何在java中实现非线性约束的非线性优化?我目前正在使用org.apache.commons.math3.optim.nonlinear.scalar.noderiv,我已经读过,默认情况下,没有一个优化器(例如我正在使用的那个,SimplexOptimizer)采用约束,而是必须通过实现MultivariateFunctionPenaltyAdapter或MultivariateFunctionMappingAdapter类将约束参数映射到不受约束的参数。但是,据我所知,即使使用这些包装器,仍然只能实现线性或“简单”约束。我想知道是否有任何方法可以包含非线性不等式约束?

例如,假设我的目标函数是3个参数的函数:a,b和c(非线性地取决于它们),另外这些参数受到ab的约束。

使用apache commons解决问题的任何建议都会很棒,但是当然也欢迎任何扩展现有类或扩充包的建议。

到目前为止,我对实施COBYLA包的最佳尝试如下:

    public static double[] Optimize(double[][] contractDataMatrix,double[] minData, double[] maxData,double[] modelData,String modelType,String weightType){

    ObjectiveFunction objective = new ObjectiveFunction(contractDataMatrix,modelType,weightType);

     double rhobeg = 0.5;
    double rhoend = 1.0e-6;
   int iprint = 3;
     int maxfun = 3500;
    int n = modelData.length;
    Calcfc calcfc = new Calcfc(){
       @Override
       public double Compute(int n, int m, double[] x, double[] con){
        con[0]=x[3]*x[3]-2*x[0]*x[1];
        System.out.println("constraint: "+(x[3]*x[3]-2*x[0]*x[1]));
        return objective.value(x);
       }
    };
    COBYLAExitStatus result = COBYLA.FindMinimum(calcfc, n, 1, modelData, rhobeg, rhoend, iprint, maxfun);


    return modelData;

}

问题是我的优化中仍然存在非法值。如您所见,在计算函数的匿名覆盖中,我打印出约束的值。结果往往是负面的。但是,这个值不应该被限制为非负面的吗?

编辑:我在我的代码中发现了这个错误,它与优化器本身无关,而是我的实现。

最佳,

1 个答案:

答案 0 :(得分:0)

您可能需要考虑 Apache Commons Math 中不可用的优化程序。对于具有非线性约束的相对较小的优化问题(少于100个变量),COBYLA是一种无导数的方法。我已将原始Fortran代码移植到Java,源代码为here