2015-07-03 52 views
0

大家好,我寫的是用於優化簡單函數的pso代碼。它沒有問題。現在我想用pso解決茶匙問題。例如,羣體向量內容是[1 2 4 3 1],最佳羣體向量是[2 3 1 4 2]。當我想更新[1 2 4 3 1]的新值時,這些值就像[1.2 2.3 3.8 3.4 1.2]。這不是真的或可以接受的答案。我怎樣才能將這個答案映射到一個真實的答案? 如果你有這個問題的一些來源,請分享它。
(我的代碼使用matlab)。 在此先感謝如何在pso優化中將連續數轉換爲離散數?

回答

0

Matlab正在使用floating point操作來執行計算。這導致錯誤。 Epsilon是精度的度量(matlab中的eps命令)。這是最小的數字> 0其中1   +   eps  !=   1。

它取決於計算如何舍入誤差會影響你。例如,如果要添加10個不同大小的數字,那麼如果按絕對值對數字進行排序並將其添加,則誤差最小。相互減去兩個幾乎相等的數字會失去很多精度,或者功率也可能很差。

==>你將不得不重寫你的算法,並考慮到這些效果的「完美」解決方案。簡單的解決方案只是對數字進行四捨五入,你可以額外定義一個閾值,比如說0.25,如果一個數字的變化超過了你輸出的警告(比如在計算逆矩陣時用matlab幾乎奇異的矩陣)。

> A = [1.2 2.3 3.8 3.4 1.2] ; 
> A = round(A) 
A = 
    1 2 4 3 1 
+0

感謝您的答案,但如果我這樣做的解決方案改變,因此這不是pso算法。答案並非如此 –

+1

@ zara-T什麼是不正確的?它將浮點數轉換爲整數,就像它在問題的標題中所說的那樣。沒有任何實施代碼,沒有人能夠猜出問題所在。 – maraca

+0

這是不正確的,因爲在pso的正常形式中,解決方案的進度不是靜態的,我的意思是如果在下一次迭代中第一次迭代中4變爲3.8,則可能變爲3.2,並且在第一次迭代的解決方案中,它的值被四捨五入爲4並在下一個4再次變爲3.8,如果我們四捨五入,值爲4。這不是真的,因爲該算法將接近羣1,在我們的解決方案中這不會發生,我認爲答案是離散PSO概念 –