啟發式演算法:這類演算法算是演算法在實際應用過程中的技術性演算法,因為在實際計算過程中,很有可能第一:無確定的目標函數;第二:無法找到真實的最優解;第三:計算代價非常大,現有的計算機技術都無法解決此類問題。所以人們就找到另一種情況,使得在可接受的計算成本內去搜尋最好的解,但不一定能保證所得的可行解和最優解,甚至在多數情況下,無法闡述所得解同最優解的近似程度。 通熟點講就是求出來的解可能不是最好的,只能說是相對較好的,但是這個相對程度就不敢保證了。雖然是這樣,但是在工程應用上來說已經非常好了。
後面講的時候可能會讓你懷疑人生,這是演算法嗎?不過它們在工程上來講確實就是。第一個要講的是模擬退火演算法,這個當年是俺對它進行了幾次改造的,結合(SPSA)隨機擾動演算法,來在一定程度上解決此山最優的局限(測試過幾次,解決低維問題還行,還有一定的局限,就是初值的選取非常重要,必須在初值選取的時候就要接近真實值,這其實是很扯淡的,在自動歷史擬合中,很多時候我們都是要進行初值的篩選的,不過這個時候初值的篩選過程就一定得有一定的依據,什麼灰色關聯啊什麼的都出來了,反正非常大的系統知識)——扯遠了。
模擬退火是什麼意思呢?它不管你什麼梯度啊什麼步長,給定一個最低溫度Tmin(這個值無限小)他只管其中一個事情,就是我們在求解的過程中,新迭代出來的函數結果與舊的函數的差值結果f(x_new)-f(x)>0時就無條件接受這個值,但是如果f(x_new)-f(x)<0,則以一定的概率(exp((f(xnew)-f(x))/k*T))來接受這個值,然後對溫度T進行一次更新,這個降溫方法為T= a*T (0<a<1),一般a取接近1的值。最後如果當前溫度<Tmin時就退出循環了。 看根本就和什麼梯度什麼步長沒關係。那麼為什麼要這樣呢?我用通熟的方法給你們解釋一下: