我嘗試使用SuanShu優化庫解決以下問題,但沒有成功。使用Apache Commons優化函數數學
優化問題是:
找到最大的整數^ 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,ε,N給出他們是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的公地數學庫,我沒有對如何使用它這個問題的線索。
好的,我使用了蠻力最小化器。出於好奇,當我使用Penalty minimizer時,結果絕對錯誤。我認爲它陷入了當地的最低限度。問題是爲什麼會發生這種情況,而最小化者是否有防範機制?我知道MultiStartOptimizer,但我指的是其他機制。 – Razvan 2012-07-22 19:25:22
所有懲罰最小化者的做法是通過對約束添加一個巨大的懲罰將一個不受限制的問題轉化爲一個約束問題。然後運行你喜歡的任何不受約束的優化器。不能保證約束條件不會被違反。 「製造」了無約束的目標函數可以是醜陋的(非凸,跳躍,你的名字......),是的,它可以很容易陷入局部。 每個最小化類應保持最小。如果我們想要獲得某種保護,應該在最小化類之外「添加」或「編碼」。否則,我們需要重複相同的機制。 – Ryu 2012-07-24 16:24:58