用java实现具有非线性不等式约束的非线性优化
如何在java中实现具有非线性约束的非线性优化?我目前使用的是org.apache.commons.math3.optim.nonlinear.scalar.noderiv,我读到没有一个优化器(比如我目前使用的SimpleOptimizer)默认接受约束,但是,我们必须通过实现MultivariateFunctionPenaltyAdapter或MultivariateFunctionMappingAdapter类,将受约束的参数映射到不受约束的参数。然而,据我所知,即使使用这些包装器,仍然只能实现线性或“简单”约束。我想知道是否有任何方法可以包含非线性不等式约束 例如,假设我的目标函数是3个参数的函数:a、b和c(非线性地取决于它们),另外这些参数受ab的约束 任何只使用ApacheCommons就可以解决问题的建议都是很好的,但是任何关于扩展现有类或扩充包的建议当然也会受到欢迎 到目前为止,我在实现COBYLA包方面的最佳尝试如下所示:用java实现具有非线性不等式约束的非线性优化,java,apache,nonlinear-optimization,Java,Apache,Nonlinear Optimization,如何在java中实现具有非线性约束的非线性优化?我目前使用的是org.apache.commons.math3.optim.nonlinear.scalar.noderiv,我读到没有一个优化器(比如我目前使用的SimpleOptimizer)默认接受约束,但是,我们必须通过实现MultivariateFunctionPenaltyAdapter或MultivariateFunctionMappingAdapter类,将受约束的参数映射到不受约束的参数。然而,据我所知,即使使用这些包装器,仍然只
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成比例的公差范围内)。