1. 頭腦風暴算法簡介
(以下描述,均不是學術用語,僅供大家快樂的閱讀)
可能大家對“頭腦風暴”這個詞不怎么熟,畢竟是外來詞匯,其大概含義就是分組討論,暢所欲言。
頭腦風暴算法(Brain Storm Optimization)是根據人們進行“頭腦風暴”討論困難問題的解決方案的過程而提出的優化算法。算法提出于2011年,很高興,這又是一個中國人提出的優化算法,不過該算法的描述和實現都比較復雜,相關的論文也不多,大家可以嘗試對其進行“開發”。
頭腦風暴算法中,每個人的位置(idea,描述為位置更好理解)表示解空間中的一個可行解。群體將會被分為幾組來進行它們的頭腦風暴,每組中位置最好的人被稱為該組的leader,也叫聚類中心。每個個體有兩種方式來到達新的位置:獨自思考,融合思考,而每個組的leader還有一種新的方式:隨機思考。每個人將根據一定的規則選取其移動方式,并選擇是否更新為這個新的idea。具體實現比較復雜,下一節將詳細描述。
2. 算法流程
人群中的個體數量為N, 其idea(位置,其實還是用位置來描述更加方便)為 ,其適應度值為 。
頭腦風暴算法大體分為兩步:
- 劃分聚類:將群體劃分為幾個小組。
- 更新位置:每個人根據不同的策略來更新自己的idea。
2.1劃分聚類
劃分聚類這一步其實很簡單,就是將群體劃分為m個組。然后以組為單位進行頭腦風暴更新位置。
劃分聚類的策略有很多,可以隨機分組,也可以使用聚類算法如:k-means,fuzzy-c-means等聚類算法。
原文的聚類選擇了k-means聚類算法,k=5。
k-means簡述:
1. 群體中隨機設置k個聚類中心。
2. 所有個體自動歸類為距自己最近的中心。
3. 更新聚類中心為該聚類的重心。
4. 直到聚類中心不再變動,否則跳至步驟2。
5. 輸出4中得到的聚類中心所劃分的聚類。
個人認為聚類步驟不應過于復雜,可以直接將群體隨機分成m組,也可以使用N mod m 來進行分組,以保證各組人數差別不會太大。
分組完成后,將每一組中最優個體作為該組的聚類中心。
2.2更新位置
更新位置這一步中,算法使用了三種策略來更新個體的idea:
1. 隨機思考:在解空間內重置該個體的idea。
2. 獨自思考:選擇一個人,并在其idea周圍搜索。
3. 融合他人:選擇兩個人,融合這兩個人的位置為一個新的idea。
2.2.1隨機思考
隨機思考是一個簡單的隨機步驟,即在解空間內隨機生成一個idea,可以看做是一個跳出局部最優的步驟,只有成為聚類中心的個體才有該操作。
2.2.2獨自思考
獨自思考步驟將會針對自己的idea進行小幅度的修改,產生一個新的idea。如果新idea優于原來的idea,則替換之。具體的實現公式如下:
其中
從公式可以看出,新的idea將會在原idea附近產生,從整體上看,這個步驟為算法提供了局部搜索操作。
2.2.3融合他人
在原文中并沒有看到融合的具體細節。
不過好在其他論文中有提及,具體公式如下:
其中A和B為選定的進行融合的兩個個體,r為取值在(0,1)內的均勻隨機數。
如果Xnew優于A,則用該idea替換A的idea,否則,再看該idea是否優于B的idea,若更優則替換否則保持B的idea不變。
可以看出產生的新的idea位于選定的兩個idea之間,實現也比較簡單。該操作為算法提供了部分全局搜索能力。但也有一個問題,與萬有引力算法類似,該操作產生的新idea位于當前所有idea圍成的凸包內,當最優的idea不在此范圍內時,難以到達最優idea附近。
如上圖,A,B,C為三個向量,其中C=rA+(1-r)B,r為(0,1)內的均勻隨機數,可知C的范圍為AB之間。
當r取值為(0,2)內的均勻隨機數時,C的取值范圍如下。
可以看出C可以去到AB之外的值。由于AB是隨機選擇的,即C=rA+(1-r)B與C=C=rB+(1-r)A都可能出現,所有r取(0,2)內的均勻隨機數即可。
當然我們也可以組合個體A和個體B的idea成為一個新的idea,此時隨機取r為0或1即可。
2.3算法步驟
上面介紹了算法的基本步驟,但原論文里寫的要比上面復雜很多。主要復雜在其步驟上,下面結合上述的基本步驟,理一理算法的實際實現步驟。
參數對應原論文中的參數,p5a = 0.2,p6b = 0.8,p6b3 = 0.4,p6c = 0.5。
Rand為(0,1)內的均勻隨機數,每個步驟會重新計算。
流程圖也有點復雜,總共有五個步驟:
1. 隨機思考:隨機選擇聚類中心進行隨機思考操作
2. 獨自思考:隨機選擇聚類中心進行獨自思考操作
3. 獨自思考:隨機選擇個體進行獨自思考操作
4. 融合思考:隨機選擇2個聚類中心進行融合思考操作
5. 融合思考:隨機選擇2個個體進行融合思考操作
算法每次迭代會使用上述5個步驟產生N個新的idea。若進行了隨機思考操作,那么其他操作會產生N-1個idea,若沒有進行隨機思考操作,則其他操作會產生N個新idea。
算法雖復雜,但其結構比較有規則,梳理清晰后還是比較好理解和記憶的。
3.實驗
適應度函數。
實驗一:
值 | |
---|---|
問題維度(維度) | 2 |
總群數量(種群數) | 20 |
最大迭代次數 | 50 |
k | 20 |
劃分聚類 | 隨機分組 |
分組數m | 5 |
融合隨機數r | Rand(0,1) |
取值范圍 | (-100,100) |
實驗次數 | 10 |
值 | |
---|---|
最優值 | 4.6314656772629463E-4 |
最差值 | 1067.9359409478532 |
平均值 | 305.88935862391594 |
從結果可以看出算法可以得到不錯的結果,也有很差的結果,圖像我選取了較差的結果的圖像。從圖像可以看出群體仍在不斷向目標位置靠近,但是由于迭代次數較少,還沒到達目標位置迭代已經結束。可以看出該條件下算法的收斂速度較慢,但有著不錯的局部搜索精度。
實驗二:選取k-means為聚類方式
值 | |
---|---|
問題維度(維度) | 2 |
總群數量(種群數) | 20 |
最大迭代次數 | 50 |
k | 20 |
劃分聚類 | k-means |
分組數m | 5 |
融合隨機數r | Rand(0,1) |
取值范圍 | (-100,100) |
實驗次數 | 10 |
值 | |
---|---|
最優值 | 0.20909178232205813 |
最差值 | 1321.371927178569 |
平均值 | 353.9612645125847 |
從圖像和結果可以看出,使用k-means算法進行聚類的結果與使用隨機分組的策略進行聚類的結果相差不多,不過好像個體聚集的好像較為密集,有點容易陷入局部最優。如圖,群體還沒聚集到目標解附近時較為集中并開始了局部搜索,此時雖然可能有聚類中心會通過隨機步驟跳出局部最優,但之后它有更大的概率與其他聚類中心融合并重新向群體聚集。
實驗三:融合過程隨機數選取rand(0,2)
值 | |
---|---|
問題維度(維度) | 2 |
總群數量(種群數) | 20 |
最大迭代次數 | 50 |
k | 20 |
劃分聚類 | 隨機分組 |
分組數m | 5 |
融合隨機數r | Rand(0,2) |
取值范圍 | (-100,100) |
實驗次數 | 10 |
值 | |
---|---|
最優值 | 1.4165053625505455E-4 |
最差值 | 60.64675577646573 |
平均值 | 14.389005547297723 |
結果比之前好了不少,但從圖像可以看出,群體沒有那么集中,聚集的沒有那么快,而且個體移動的幅度較大。修改了融合步驟的隨機數后,算法的全局搜索能力有了提升,但收斂速度下降了不少,群體還沒有聚集到一塊算法已經運行完畢。不過從圖像的趨勢可以看出,如果能增加迭代次數,算法能夠得到更好的結果。
實驗四:融合過程隨機數選取rand{0,1}
值 | |
---|---|
問題維度(維度) | 2 |
總群數量(種群數) | 20 |
最大迭代次數 | 50 |
k | 20 |
劃分聚類 | 隨機分組 |
分組數m | 5 |
融合隨機數r | Rand{0,1} |
取值范圍 | (-100,100) |
實驗次數 | 10 |
值 | |
---|---|
最優值 | 2.9866482236668317E-5 |
最差值 | 447.3550076153455 |
平均值 | 123.7297434413936 |
實驗四的結果不如實驗三,它的問題和實驗一類似,當目標的各個維度距群體較遠時,則較難快速向目標位置靠近。實驗三的策略類似于遺傳算法的交叉步驟,從圖像可以看出,群體總是在一個類似十字架的形狀上移動,但當所有個體的某一維度距離目標位置,群體將難以到達目標位置。既然如此,可以將融合步驟改為類似差分進化算法的交叉步驟,相信會有不錯的效果,但是融合所需的個體也將由2個變為3個,具體的實現留給大家自己實現吧。
4.總結
頭腦風暴算法是根據人們運用頭腦風暴方法思考問題而提出的優化算法。算法原文描述比較復雜,但究其本質,還是一個將群體分組,并按組進行搜索的算法,在已有算法中也有不少算法采用了類似的策略,比如人工蜂群算法(按蜜源分組),螢火蟲算法改進版(分簇螢火蟲算法),蛙跳算法(取模分組)。
頭腦風暴結合了聚類算法進行分組,與隨機分組相較各有利弊,聚類算法將選取較為集中的個體集中搜索,但易陷入局部最優,不過可以通過改進聚類算法的“距離”的定義來避免,不使用直接的個體位置計算距離,也可以考慮將其適應度函數作為權重。
算法主要有隨機思考,獨自思考,融合思考三個搜索步驟,分別提供了跳出局部最優能力,局部搜索能力和全局搜索能力。從實驗圖像可知,由于隨機思考步驟,有不少距目標位置較近的點莫名的消失了,這對整體來說損失了不少的精度,并降低了算法的收斂速度。故可以考慮保留全局最優個體,當其進行隨機思考時進行貪婪算法過濾新解或者直接不能選擇該個體進行隨機思考操作。
參考文獻
Cheng S , Qin Q , Chen J , et al. Brain storm optimization algorithm[J]. Artificial Intelligence Review, 2016. 提取碼:d5it
El-Abd M . Global-best Brain Storm Optimization Algorithm[J]. Swarm and Evolutionary Computation, 2017, 37.提取碼:0lax
以下指標純屬個人yy,僅供參考
指標 | 星數 |
---|---|
復雜度 | ★★★★★★★☆☆☆ |
收斂速度 | ★★★★☆☆☆☆☆☆ |
全局搜索 | ★★★★★☆☆☆☆☆ |
局部搜索 | ★★★★★★☆☆☆ |
優化性能 | ★★★★★★☆☆☆☆ |
跳出局部最優 | ★★☆☆☆☆☆☆☆☆ |
改進點 | ★★★★☆☆☆☆☆☆ |