樽海鞘羣算法原理詳解

樽海鞘羣算法原理詳解

首先請大家跟我讀,樽(zūn)海(hǎi)鞘(qiào)
網上看了不少論文用了這個算法,但是還沒有很詳細清楚的原理介紹。所以我就來開一篇啦。

起源背景

首先這個算法是 Mirjalili 等人2017年在文章《Salp Swarm Algorithm:A bio-inspired optimizer for engineering design problems》中介紹的一個模擬樽海鞘生物的智能優化算法。它對於一些優化問題具有很強的優越性,當然它也會包含一些類似於粒子羣等算法相關的內容。

羣體智能算法介紹

首先我們先要知道這個算法是做什麼的,我們先舉一個最簡單的例子,假如說,有一個函數f(x,y)=100(x3)2(y4)2f(x,y) = 100 - (x-3)^2 - (y-4)^2,當然這個函數是我隨便寫的,但是我們不用很關心這個函數的表達式是什麼樣子的,我們只需要知道,我們現在的任務是找到一對數字 (x0,y0)(x_0,y_0) 使得這一對數字作爲自變量帶到函數式裏面可以讓函數值 f(x,y)f(x,y) 的值儘量的大。現在我們就一步一步來使用更高端的方法。

  1. 如果我們高中的做法,肯定是使用一些數學的知識,比如根據感覺我們知道這個函數在 (3,4)(3,4) 這個點可以取得最大值。其實這個函數就是下面這個樣子的,可以想象一下,最高點在 (3,4,100)(3,4,100)。這種方法需要一定的數學基礎。

在這裏插入圖片描述

  1. 後來我們學會了使用計算機,我只需要在一定範圍內枚舉所有的自變量的值,找到最大的函數值,就是我們希望找到的了。這個的優勢就是,如果 f(x)f(x) 變成這個樣子 f(x)=cos((x2+y2)16)+sin((x2+y2)16)f(x) = cos((x^2+y^2)^{\frac16}) + sin((x^2+y^2)^{\frac16}) 甚至更復雜的樣子,那麼數學能力總有捉雞的時候,所以這時第二種方法的優越性就體現出來了。這種方法很暴力無腦,但是需要確定一個適當的枚舉範圍,因爲自變量的範圍可能會很大很大。更需要很強的計算機運算能力。

    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;   
    }
    
  2. 再後來我們發現,如果我們不一定非要找到能使得這個函數取得最大值的自變量,而是隻需要使得這個函數的函數值儘量大就可以了,那麼這樣我們就可以通過放棄最優解而減輕很大的計算量,使得計算較優解變得可行。下面偷雞開始了,最簡單的,我就根據我的計算能力隨機的在定義域內取若干個點,然後計算它們的函數值,取其中最大的一個作爲我們函數的這個優化結果。這樣的好處就是,我根據我的計算機計算能力,限定時間內,我能計算多少個點,我就隨機取多少個點進行計算。代碼如下:

    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. 偷雞繼續中,上面方法3雖然是隨機的,但是我們希望可以更多地利用到之前隨機得到的信息,也就是之前隨機到的每個點的函數值,來讓我們下一次隨機的位置更有意義。那麼如何利用呢,我們重新看這個問題,我們這個函數的圖像想象成是一個凹凸不平的山脈。如果是上面的函數,那麼我們可以看到它只有一個山頂,但是如果是分段函數呢,或者有的函數不好用表達式表示出來,而是一段代碼描述。那麼這個函數的圖像就會是一個凹凸不平的山脈,我們的目標就是找到他的最高峯,或者說,找到一個儘量高的位置。那麼這個時候如果是我們人類,我們就會充分的利用我們掌握的信息,比如我們站在一個點上,我們肯定就會盡量向周圍高的方向前進,那麼動物也是,而且因爲獲取的信息有限(只能知道當前所在點的位置的高度),所以有時候往往動物的一些行爲對於這種找最高點的目標更有優勢。這樣就衍生了各種各樣的羣體智能算法,其實都是在模擬各種各樣的小動物的行爲。從衆多的羣體智能算法中,我們這一篇博客講的就是模擬樽海鞘行動的算法。

  4. 我們繼續進行擴展,上面我們的方法都是對於某一個形如 f(x,y)f(x,y) 的自變量是二維向量的,那麼如果是自變量是 nn 維向量的呢,當然是看成是在一個 n+1n+1 維空間的山上找最高峯啦,那麼我們的生物就是在 nn 維空間上移動,所在的每一個位置都有一個對應的山峯的高度,這樣讓生物按照一定的規則移動去尋找最高峯就好啦。

樽海鞘算法原理

好了下面就是進入正題的階段了,樽海鞘羣算法就是在模擬樽海鞘的聚集行爲,它們組成樽海鞘鏈,然後進行捕食和移動。樽海鞘鏈由兩種類型的樽海鞘組成:領導者追隨者,領導者是鏈的頭部的樽海鞘,鏈上後邊的都是追隨者角色。

在這裏插入圖片描述

現在假設我們要在一個 n+1n+1 維空間的山中找一個最高峯,我們就讓每一個樽海鞘個體的位置表示成一個 nn 維向量,或者叫一個位置矢量 (x1,x2,...,xn)(x_1,x_2,...,x_n)dd 個樽海鞘連成的樽海鞘鏈就可以看成是一個種羣,用一個 d×Nd\times N 的矩陣表示:
X=[x11x21...xN1x12x22...xN2............x1dx2d...xNd] X =\begin{bmatrix}x_1^1 & x_2^1 & ... & x_N^1\\ x_1^2& x_2^2 & ... &x_N^2 \\ ...& ... & ... & ... \\ x_1^d & x_2^d & ... & x_N^d\\\end {bmatrix}\quad
其中第 ii 個樽海鞘個體的表示爲:Xi=[x1ix2i...xNi]X_i =\begin{bmatrix}x_1^i & x_2^i & ...& x_N^i \\\end {bmatrix} 。這時我們把要求最大值的函數叫做目標函數或者適應度函數,一個個體就可以作爲自變量帶入這個公式中計算出它對應的函數值,這個數值也可以看做是他們對環境的適應程度,或者說叫優秀程度,這個值越高說明這個個體越優秀。然後我們就把這個個體的當前位置當做食物的位置,然後通過公式進一步的模擬樽海鞘的行爲。

  • 領導者樽海鞘:領導者也就是 XX 矩陣中的第一個向量,它作爲領導者,它的下一步位置就是會一定程度的朝着食物前進。因此領導者的位置更新公式爲:
    xj1={Fj+c1((maxjminj)c2+minj),c30.5Fjc1((maxjminj)c2+minj),c3<0.5 x_j^1=\begin{cases} F_j+c_1((max_j-min_j)c_2+min_j),\quad c_3\ge 0.5\\ F_j-c_1((max_j-min_j)c_2+min_j),\quad c_3< 0.5 \end{cases}
    xj1x_j^1 爲領導者在第 jj 維空間的位置;FjF_j 爲食物在第 jj 維空間的位置;maxjmax_j 是第 jj 維空間的取值上邊界,minjmin_j 是第 jj 維空間的取值下邊界;c2c_2c3c_3 是區間 [0,1][0,1] 內產生的隨機數,c2c_2 決定的是移動的長度,c3c_3 決定的是移動的方向的正反;c1c_1 主要用於控制整個羣體的探索能力開發能力,它和當前種羣的迭代次數有關。c1=2e(4tTmax)2c_1 = 2e^{- (\frac{4t}{T_{max}})^2}tt 爲當前的迭代次數,TmaxT_{max} 爲最大的迭代次數。

  • 追隨者樽海鞘:顧名思義,追隨者樽海鞘就是跟着領導者來運動的,第 ii 只追隨者下一次迭代的位置是由,“當前迭代中它自己的位置””第 i1i-1 只樽海鞘的位置“ 共同決定的。根據牛頓運動定理公式的一定化簡我們得到追隨者的位置更新公式:
    xji(t)=12[xji(t1)+xji1(t1)] x_j^i(t) = \frac {1}{2}[x_j^i(t-1)+x_j^{i-1}(t-1)]
    其中:xji(t)x_j^i(t) 表示在第 tt 次迭代的時候,第 ii 只樽海鞘在第 jj 維空間的座標。

至此我們就描述完成了樽海鞘羣算法的兩種個體的行爲模式,接下來只要選定合適的參數進行模擬就可以了。


後面待更新。。。。。。
歡迎交流QQ:1040865060

樽海鞘羣算法解決路徑規劃時的編碼設計

代碼實現

C++版:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章