如何在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;
}
问题是我的优化中仍然存在非法值。如您所见,在计算函数的匿名覆盖中,我打印出约束的值。结果往往是负面的。但是,这个值不应该被限制为非负面的吗?
编辑:我在我的代码中发现了这个错误,它与优化器本身无关,而是我的实现。最佳,
保