Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用java实现具有非线性不等式约束的非线性优化_Java_Apache_Nonlinear Optimization - Fatal编程技术网

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

用java实现具有非线性不等式约束的非线性优化,java,apache,nonlinear-optimization,Java,Apache,Nonlinear Optimization,如何在java中实现具有非线性约束的非线性优化?我目前使用的是org.apache.commons.math3.optim.nonlinear.scalar.noderiv,我读到没有一个优化器(比如我目前使用的SimpleOptimizer)默认接受约束,但是,我们必须通过实现MultivariateFunctionPenaltyAdapter或MultivariateFunctionMappingAdapter类,将受约束的参数映射到不受约束的参数。然而,据我所知,即使使用这些包装器,仍然只

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

例如,假设我的目标函数是3个参数的函数:a、b和c(非线性地取决于它们),另外这些参数受ab的约束 任何只使用ApacheCommons就可以解决问题的建议都是很好的,但是任何关于扩展现有类或扩充包的建议当然也会受到欢迎

到目前为止,我在实现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;

}
问题是我在优化中仍然得到非法值。如您所见,在compute函数的匿名重写中,我正在打印出约束的值。结果往往是负面的。但是这个值不应该限制为非负吗

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

最好的


保罗

你可能想考虑一个在Apache CuMon数学中不可用的优化器。是一种用于具有非线性约束的相对较小的优化问题(少于100个变量)的无导数方法。我已经将原来的Fortran代码移植到Java,源代码是。

Hi Anders,感谢您的回复。我尝试过使用你的类,但是当我尝试构建你的项目时,我遇到了一个错误。我将项目的“src”文件中的三个类复制并粘贴到我的项目文件夹中,但我得到了一个错误:在Cobyla类中,被重写的方法“Compute”给出了一个编译错误:“方法不重写或实现来自超类型的方法”。这是我做的不对吗?你收到了什么编译错误?您是否尝试过自己编译代码,例如在Netbeans中?您使用的是哪个Java版本?上面引用了我收到的编译错误。我正在使用JavaJRE7。我不知道你说的“自己编译”是什么意思。。。如果我将三个源文件单独放在一个项目文件夹中,我会得到相同的错误。当您复制这些文件时,是否将它们放在新路径中?然后您是否在所有文件中一致地更改包名?您是否也包含了Calcfc.java文件,该文件提供了所讨论的超类型?我刚刚自己导入了这个项目,成功地构建并运行了单元测试。除了第一个问题,以上所有问题都是肯定的。我在我的项目文件夹中创建了新的空白文件,然后在src目录中复制并粘贴了.java文件,然后适当地更改了所有包名。在优化过程中,COBYLA优化器不限于可行区域,因此在特定迭代中,约束值很可能为负值。但是,在成功收敛时,约束值应为非负(在与RHOEND成比例的公差范围内)。