2015-07-21 69 views
1

我正在測試一種新的優化算法,並在Java中有一個完整的測試框架。我將這與以前的論文結果進行了比較(其中一個是衆所周知的CLPSO論文)。關於函數的更多信息 - http://www.sfu.ca/~ssurjano/ackley.htmlJava - Ackley測試函數

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)); 
} 

我目前在我的向量X = 0

--something與訂單/括號做得到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); 
+1

想知道如果對這些您需要的行數: 'sum1 + = Math.pow(x [i],2.0); sum2 + =(Math.cos(2.0 * Math.PI * x [i]));' 這也可能有助於使最後一行有'Math.exp(1.0)' 類似的問題整數除法,但與地板/舍入? –

+0

嗨賈森,不幸的是我希望它是這麼簡單,鑑於值是2和1應該沒有類型轉換/數字格式錯誤,我試圖檢查,仍然得到8.881784197001252E-16,在我的X = 0向量 –

+1

我懂了。 爲了讓問題更容易理解,您可以添加您在for循環中獲得的總和的樣本值嗎? –

回答

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);