SuanShu 最適化ライブラリを使用して次の問題を解決しようとしましたが、成功しませんでした。
最適化問題は次のとおりです。
次の制約が成り立つような最大の積分 h を見つけます。
(h-2) * ArithmeticUtils.binomialCoefficient(b+h-2, h-1) -
ArithmeticUtils.binomialCoefficient(b+h-3, h-3) +
ArithmeticUtils.binomialCoefficientDouble(b+h-3,h-2)
- 2*epsilon*N
ここで、b、epsilon、N が指定され、それぞれ int、double、int です。
どのオプティマイザとどの最適化機能を使用すればよいか教えてください。
これまでのコードは次のようになります。
public void optimize(){
//create the univariate function to be optimized
UnivariateRealFunction functionToOptimize = new UnivariateRealFunction() {
@Override
public double evaluate(double h) {
return -h;
}
};
UnivariateRealFunction hConstraint = new UnivariateRealFunction() {
public double evaluate(double h) {
(h-2) * ArithmeticUtils.binomialCoefficient(b+h-2, h-1) -
ArithmeticUtils.binomialCoefficient(b+h-3, h-3) +
ArithmeticUtils.binomialCoefficientDouble(b+h-3,h-2)
- 2*epsilon*N
}
};
List<RealScalarFunction> constraints = new ArrayList<RealScalarFunction>();
constraints.add(hConstraint);
ConstrainedOptimProblem problem = new ConstrainedOptimProblem(
functionToOptimize,
null,
new GeneralLessThanConstraints(constraints));
BFGS bfgs = new BFGS();
PenaltyMethodMinimizer optim = new PenaltyMethodMinimizer(
PenaltyMethodMinimizer.DEFAULT_PENALTY_FUNCTION_FACTORY,
1e30,
bfgs);
optim.solve(problem,1e-3,200);
Vector xmin = optim.search(new DenseVector(new int[]{8}));
double fxmin = functionToOptimize.evaluate(xmin.get(1));
System.out.println("fxmin: "+fxmin);
System.out.println(String.format("f(%s) = %f",
DoubleUtils.doubleArray2StringArray(xmin.toArray()), fxmin));
}
私は Apache commons math library を調べましたが、この問題でそれを使用する方法についての手がかりがありません。