樽海鞘羣算法原理詳解
首先請大家跟我讀,樽(zūn)海(hǎi)鞘(qiào)!
網上看了不少論文用了這個算法,但是還沒有很詳細清楚的原理介紹。所以我就來開一篇啦。
起源背景
首先這個算法是 Mirjalili 等人2017年在文章《Salp Swarm Algorithm:A bio-inspired optimizer for engineering design problems》中介紹的一個模擬樽海鞘生物的智能優化算法。它對於一些優化問題具有很強的優越性,當然它也會包含一些類似於粒子羣等算法相關的內容。
羣體智能算法介紹
首先我們先要知道這個算法是做什麼的,我們先舉一個最簡單的例子,假如說,有一個函數,當然這個函數是我隨便寫的,但是我們不用很關心這個函數的表達式是什麼樣子的,我們只需要知道,我們現在的任務是找到一對數字 使得這一對數字作爲自變量帶到函數式裏面可以讓函數值 的值儘量的大。現在我們就一步一步來使用更高端的方法。
- 如果我們高中的做法,肯定是使用一些數學的知識,比如根據感覺我們知道這個函數在 這個點可以取得最大值。其實這個函數就是下面這個樣子的,可以想象一下,最高點在 。這種方法需要一定的數學基礎。
-
後來我們學會了使用計算機,我只需要在一定範圍內枚舉所有的自變量的值,找到最大的函數值,就是我們希望找到的了。這個的優勢就是,如果 變成這個樣子 甚至更復雜的樣子,那麼數學能力總有捉雞的時候,所以這時第二種方法的優越性就體現出來了。這種方法很暴力無腦,但是需要確定一個適當的枚舉範圍,因爲自變量的範圍可能會很大很大。更需要很強的計算機運算能力。
double f(int x, int y) { return 100 - (x-3)*(x-3) - (y-4)*(y-4); } double getMax(){ double ans = -inf; for (int i=-100; i<=100; i++) { for (int j=-100; j<=100; j++) { ans = max(ans, f(i,j)); } } return ans; }
-
再後來我們發現,如果我們不一定非要找到能使得這個函數取得最大值的自變量,而是隻需要使得這個函數的函數值儘量大就可以了,那麼這樣我們就可以通過放棄最優解而減輕很大的計算量,使得計算較優解變得可行。下面偷雞開始了,最簡單的,我就根據我的計算能力隨機的在定義域內取若干個點,然後計算它們的函數值,取其中最大的一個作爲我們函數的這個優化結果。這樣的好處就是,我根據我的計算機計算能力,限定時間內,我能計算多少個點,我就隨機取多少個點進行計算。代碼如下:
double f(int x, int y) { return 100 - (x-3)*(x-3) - (y-4)*(y-4); } double getMax(){ double ans = -inf; int T = 100000; while(T--){ ans = max( ans , f(rand(), rand()) ); } return ans; }
-
偷雞繼續中,上面方法3雖然是隨機的,但是我們希望可以更多地利用到之前隨機得到的信息,也就是之前隨機到的每個點的函數值,來讓我們下一次隨機的位置更有意義。那麼如何利用呢,我們重新看這個問題,我們這個函數的圖像想象成是一個凹凸不平的山脈。如果是上面的函數,那麼我們可以看到它只有一個山頂,但是如果是分段函數呢,或者有的函數不好用表達式表示出來,而是一段代碼描述。那麼這個函數的圖像就會是一個凹凸不平的山脈,我們的目標就是找到他的最高峯,或者說,找到一個儘量高的位置。那麼這個時候如果是我們人類,我們就會充分的利用我們掌握的信息,比如我們站在一個點上,我們肯定就會盡量向周圍高的方向前進,那麼動物也是,而且因爲獲取的信息有限(只能知道當前所在點的位置的高度),所以有時候往往動物的一些行爲對於這種找最高點的目標更有優勢。這樣就衍生了各種各樣的羣體智能算法,其實都是在模擬各種各樣的小動物的行爲。從衆多的羣體智能算法中,我們這一篇博客講的就是模擬樽海鞘行動的算法。
-
我們繼續進行擴展,上面我們的方法都是對於某一個形如 的自變量是二維向量的,那麼如果是自變量是 維向量的呢,當然是看成是在一個 維空間的山上找最高峯啦,那麼我們的生物就是在 維空間上移動,所在的每一個位置都有一個對應的山峯的高度,這樣讓生物按照一定的規則移動去尋找最高峯就好啦。
樽海鞘算法原理
好了下面就是進入正題的階段了,樽海鞘羣算法就是在模擬樽海鞘的聚集行爲,它們組成樽海鞘鏈,然後進行捕食和移動。樽海鞘鏈由兩種類型的樽海鞘組成:領導者和追隨者,領導者是鏈的頭部的樽海鞘,鏈上後邊的都是追隨者角色。
現在假設我們要在一個 維空間的山中找一個最高峯,我們就讓每一個樽海鞘個體的位置表示成一個 維向量,或者叫一個位置矢量 , 個樽海鞘連成的樽海鞘鏈就可以看成是一個種羣,用一個 的矩陣表示:
其中第 個樽海鞘個體的表示爲: 。這時我們把要求最大值的函數叫做目標函數或者適應度函數,一個個體就可以作爲自變量帶入這個公式中計算出它對應的函數值,這個數值也可以看做是他們對環境的適應程度,或者說叫優秀程度,這個值越高說明這個個體越優秀。然後我們就把這個個體的當前位置當做食物的位置,然後通過公式進一步的模擬樽海鞘的行爲。
-
領導者樽海鞘:領導者也就是 矩陣中的第一個向量,它作爲領導者,它的下一步位置就是會一定程度的朝着食物前進。因此領導者的位置更新公式爲:
爲領導者在第 維空間的位置; 爲食物在第 維空間的位置; 是第 維空間的取值上邊界, 是第 維空間的取值下邊界; 和 是區間 內產生的隨機數, 決定的是移動的長度, 決定的是移動的方向的正反; 主要用於控制整個羣體的探索能力和開發能力,它和當前種羣的迭代次數有關。, 爲當前的迭代次數, 爲最大的迭代次數。 -
追隨者樽海鞘:顧名思義,追隨者樽海鞘就是跟着領導者來運動的,第 只追隨者下一次迭代的位置是由,“當前迭代中它自己的位置” 和 ”第 只樽海鞘的位置“ 共同決定的。根據牛頓運動定理公式的一定化簡我們得到追隨者的位置更新公式:
其中: 表示在第 次迭代的時候,第 只樽海鞘在第 維空間的座標。
至此我們就描述完成了樽海鞘羣算法的兩種個體的行爲模式,接下來只要選定合適的參數進行模擬就可以了。
後面待更新。。。。。。
歡迎交流QQ:1040865060