1. 程式人生 > >模擬退火演算法之運用例項

模擬退火演算法之運用例項

前一篇貼了一個模擬退火演算法模板,可能有些沒有交代清楚,就其使用來說,上述演算法不需做任意修改就可使用,只需對實際的問題建模然後和這個演算法模板合併使用即可.

XXXCoolingPolicy 是指溫度冷卻的策略,動態冷卻會根據本次迴圈過程的反饋去調整溫度的冷卻,此方法系國外一研究專家所發明,能自適應的去調整溫度,至於專家名字,很抱歉,我忘了...要花時間去把資料翻出來.  靜態的當然很簡單,就是簡單的降低溫度的某個固定值或者固定百分比.

XXXSelectPolicy是指選擇策略.  對於單體而言,它有n類的鄰域變化型別,比如對於tsp問題,我們只是不停的交換兩個城市的位置,那麼對於這樣的模型,就是隻有一種鄰域型別,如果你還想加上其它的比如兩個相鄰的和另外兩個相鄰的城市一起交換順序,那麼這時候就成了兩種鄰域型別.  均等的選擇策略就是平均的分配這些機會給各種不同的鄰域變化型別,而動態的則要根據上一輪各個鄰域型別的貢獻值而定.

這樣,我們要建一個解決TSP問題的模型再簡單不過了,看起來就是下面這個樣子

  

.

模擬退火演算法應用其實很廣泛, 推而廣之,我們來看看看似毫不相干的曲線離散化的優化.

某個CAD軟體中對於曲線的輸出採用固定的段數離散化輸出,假設它分成10段吧,但是效果卻很差,對於比較平坦的曲線來說還好,對於曲率變化大的曲線來說,在曲率大的地方明顯失真,因為軟體中的離散化是按照十段平均取曲線引數的,即0,0.1,0.2,...1.0(假定是規範的引數域).這樣難免會在曲率大的地方失真嚴重,這裡就可以優化了,其實就是對引數點的選取進行優化.

現在分析這個問題,首先目標值是什麼?  我們的目標就是整體誤差最小,或者你可以定義某種標準來衡量它的視覺效果的話也無不可. 這個你可以自己取根據需要制定,比如,你想讓離散化的線段最接近原來那段曲線,你可以用線段中點到曲線的引數中點的距離來衡量. 你確定了目標值,我們就可以開始下面的步驟了.

你要操作哪些具體的物件來達到你的預期? 前面已經說過,我們要對引數的選取優化,但是10段是規定好了的,不能變化,我們可以設這初始的引數值就是0.0,0.1...1.0.  然後隨機選取一個去調整,調整之後再計算目標值,在一定的概率下看是否接受這次改變. 經過若干次的外迴圈和內迴圈,你可以得到相對優化的結果.   如果這句話你看不大明白,建議你再看看模擬退火演算法的原理.

其實可以運用的地方很多,比如你有一張券,面值10000元,券只能抵消費不能找現退現,你去某超市用券買東西,你就要最大化利用你的券,但是你肯定不想買你完全不需要的東西,你的策略大概是大部分買你需要的,剩下的零頭買可要可不要的,如果還有零頭就隨便拿點小商品充數.這樣你就等於見了一個你這次消費的模型了,你可以試試看,算一下,如果對於需要的東西而言已有很需要和一般需要而言,你還可以加上權值,總之,你建好了模型就好了,模擬退火演算法可以很輕鬆的解決這些問題.  ....

.