我正在测试一种新的优化算法,并且有一个完整的 Java 测试框架。我将其与之前论文的结果进行比较(其中一篇是著名的 CLPSO 论文)。有关该功能的更多信息 - http://www.sfu.ca/~ssurjano/ackley.html
Ackley 函数众所周知,并且是我的测试套件的一部分,尽管在该函数的 Java 实现中,我似乎无法使函数最小值为 0(对于所有 i,这应该发生在 x[i] = 0 时)。我猜这是 Java 中 exp 的一些舍入/处理。有什么减少这些计算错误的建议吗(必须是 Java 语言)?我当前的实现是:
public double f(double[] x) {
double sum1 = 0.0;
double sum2 = 0.0;
for (int i = 0 ; i < x.length ; i ++) {
sum1 += Math.pow(x[i], 2);
sum2 += (Math.cos(2*Math.PI*x[i]));
}
return (-20.0 * Math.exp(-0.2 * Math.sqrt(sum1 / ((double )x.length))) -
Math.exp(sum2 / ((double )x.length)) + 20.0 + Math.exp(1));
}
我目前在 vector X = 0 处获得最小值 8.881784197001252E-16
--与顺序/括号有关...
return -20.0*Math.exp(-0.2*Math.sqrt(sum1 / ((double )x.length))) + 20
- Math.exp(sum2 /((double )x.length)) + Math.exp(1.0);
最佳答案
问题在于括号和计算顺序(不要问我如何或为什么!)
return -20.0*Math.exp(-0.2*Math.sqrt(sum1 / ((double )x.length))) + 20
- Math.exp(sum2 /((double )x.length)) + Math.exp(1.0);
关于Java - Ackley 测试函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31548955/