羣體智能優化算法之鯨魚優化算法(Whale Optimization Algorithm,WOA)

在這裏插入圖片描述
獲取更多資訊,趕快關注上面的公衆號吧!

鯨魚優化算法(Whale Optimization Algorithm,WOA)

  本文將介紹一種新的受自然啓發的元啓發式優化算法——鯨魚優化算法(WOA),該算法模擬了座頭鯨的社會行爲,並引入了氣泡網狩獵策略。點擊“這裏”,可以下載MATLAB源碼。

1.1 靈感

  鯨魚被認爲是世界上最大的哺乳動物。一頭成年鯨可以長達 30 米,重 180 噸。這種巨型哺乳動物有 7 種不同的主要物種,如虎鯨,小鬚鯨,鰮鯨,座頭鯨,露脊鯨,長鬚鯨和藍鯨等。鯨通常被認爲是食肉動物,它們從不睡覺,因爲它們必須到海洋表面進行呼吸,但事實上,鯨魚有一半的大腦都處於睡眠狀態。

  鯨魚在大腦的某些區域有與人類相似的細胞,這些細胞被稱爲紡錘形細胞(spindle cells)。這些細胞負責人類的判斷、情感和社會行爲。換句話說,紡錘形細胞使我們人類有別於其他生物。鯨魚的這些細胞數量是成年人的兩倍,這是它們具有高度智慧和更富情感的主要原因。已經證明,鯨魚可以像人類一樣思考、學習、判斷、交流,甚至變得情緒化,但顯然,這都只是在一個很低的智能水平上。據觀察,鯨魚(主要是虎鯨)也能發展自己的方言。

  另一個有趣的點是關於鯨魚的社會行爲,它們可獨居也可羣居,但我們觀察到的大多數仍然是羣居。它們中的一些物種(例如虎鯨)可以在整個生命週期中生活在一個家族中。最大的鬚鯨之一是座頭鯨,一頭成年座頭鯨幾乎和一輛校車一樣大。它們最喜歡的獵物是磷蝦和小魚羣。圖1顯示的就是這種哺乳動物。

圖1 座頭鯨的氣泡網進食行爲

  關於座頭鯨最有趣的事情是它們特殊的捕獵方法了。這種覓食行爲被稱爲氣泡網覓食法(bubble-net feeding method)。座頭鯨喜歡在接近海面的地方捕食磷蝦或小魚。據觀察,這種覓食是通過在圓形或類似數字“9”形路徑上製造獨特的氣泡來完成的,如圖 1 所示。在 2011 年之前,這一行爲僅僅是基於海面觀測的。然而,有研究者利用標籤傳感器研究了這種行爲。他們捕獲了9頭座頭鯨身上300個由標籤得到的氣泡網進食事件。他們發現了兩種與氣泡有關的策略,並將它們命名爲上升螺旋(upward-spirals)雙螺旋(doubleloops)。在前一種策略中,座頭鯨會潛到水下 12 米左右,然後開始在獵物周圍製造一個螺旋形的泡泡,並遊向水面;後一種策略包括三個不同的階段:珊瑚循環,用尾葉拍打水面以及捕獲循環。這裏不展開詳細描述。

  但是氣泡網捕食是隻有座頭鯨獨有的一種特殊行爲,而鯨魚優化算法就是模擬了螺旋氣泡網進食策略達到優化的目的。

1.2 數學建模和優化算法

1.2.1 包圍捕食(Encircling prey)

  座頭鯨可以識別獵物的位置並將其包圍。由於最優設計在搜索空間中的位置不是先驗已知的,WOA 算法假設當前的最佳候選解是目標獵物或接近最優解。在定義了最佳搜索代理之後,其他搜索代理將因此嘗試向最佳搜索代理更新它們的位置。這種行爲由下列方程表示:

D=CX(t)X(t)(1)\vec{D}=\left|\vec{C} \vec{X}^{*}(t)-\vec{X}(t)\right|\tag{1}
X(t+1)=X(t)AD(2)\vec{X}(t+1)=\vec{X}^{*}(t)-\vec{A} \cdot \vec{D}\tag{2}

其中t爲當前迭代,A\vec{A}C\vec{C} 爲係數向量,XX^{*} 是當前最優解的位置向量,X\vec{X} 是當前解的位置向量,||表示絕對值操作,.表示元素相乘。每次迭代過程中有更優解出現時就需要更新 XX^{*}A\vec{A}C\vec{C} 計算如下:
A=2ara(3)\vec{A}=2 \vec{a} \cdot \vec{r}-\vec{a}\tag{3}
C=2r(4)\vec{C}=2 \cdot \vec{r}\tag{4}

其中 a\vec{a} 在迭代過程中從2線性地下降至0(探索和利用階段均如此)。r\vec{r} 爲[0,1]之間的隨機向量。

  圖 2a 描述了等式(2)針對2D問題的基本原理,搜索代理的位置(X,Y)(X,Y)可以根據當前最優解的位置(X,Y)(X^{*},Y^{*})進行更新,通過調整向量 A\vec{A}C\vec{C} 的值,可以找到相對於當前位置下一時刻最優代理附近的不同地方。在 3D 空間中搜索代理可能的更新位置如圖 2b。通過定義隨機向量 r\vec{r},可以到達圖 2 中所示關鍵點之間的搜索空間內任何位置,因此等式(2)允許任何搜索代理在當前最優解的鄰域內更新其位置,從而模擬了鯨魚的包圍捕食。

  相似的概念也可以擴展到 n 維搜索空間。

  注意圖2中的兩幅圖均是在a=1和C=1情況下的。

a

b
圖2 2D和3D位置向量及其可能的下一個位置

1.2.2 氣泡網攻擊方式(Bubble-net attacking method)(利用階段)

  共設計了兩種方法來對座頭鯨的氣泡網行爲進行建模:

  1. 收縮包圍機制:通過降低式(3)中 a\vec{a} 的值實現。注意 A\vec{A} 的波動範圍也通過 a\vec{a} 降低,換句話說,A\vec{A} 是一個區間[-a,a]內的隨機值,a 隨着迭代進行從 2 降爲 0。設置 A\vec{A} 中的隨機值在[-1,1]之間,搜索代理的新位置可以定義爲代理原始位置與當前最優代理位置之間的任意位置。圖 3a 顯示了 2D 空間中當 0A10 \leq A \leq 1 時從 (X,Y)(X,Y) 靠近 (X,Y)(X^{*},Y^{*}) 所有可能的位置。這種機制本質上就是包圍捕食
  2. 螺旋更新位置。如圖 3b,該方法首先計算鯨魚位置 (X,Y)(X,Y) 與獵物位置 (X,Y)(X^{*},Y^{*}) 之間的距離,然後在鯨魚與獵物位置之間創建一個螺旋等式,來模仿座頭鯨的螺旋狀移動:
    X(t+1)=Deblcos(2πl)+X(t)(5)\vec{X}(t+1)=\overrightarrow{D^{\prime}} \cdot e^{b l} \cdot \cos (2 \pi l)+\overrightarrow{X^{*}}(t)\tag{5}
    其中 D=X(t)X(t)\overrightarrow{D^{\prime}}=|\overrightarrow{X^{*}}(t)-\vec{X}(t)|,表示第i頭鯨魚與獵物(當前最優解)之間的距離,b爲常數,定義了對數螺線的形狀,l是[-1,1]之間的隨機數,符號“.”表示元素相乘。
(a)收縮包圍機制

(b)螺旋更新位置
圖3 WOA中實現的氣泡網搜索機制

  值得注意的是,座頭鯨在一個不斷縮小的圓圈內繞着獵物遊動,同時沿着螺旋形路徑遊動。爲了對這種同時發生的行爲進行建模,假設有 50%的可能性在收縮包圍機制和螺旋模型之間進行選擇,以便在優化過程中更新鯨魚的位置,數學模型如下:
X(t+1)={X(t)AD if p<0.5Deblcos(2πl)+X(t) if p0.5(6)\vec{X}(t+1)=\left\{\begin{array}{ll} \vec{X}^{*}(t)-\vec{A} \cdot \vec{D} & \text { if } p<0.5 \\ \overrightarrow{D^{\prime}} \cdot e^{b l} \cdot \cos (2 \pi l)+\overrightarrow{X^{*}}(t) & \text { if } p \geq 0.5 \end{array}\right.\tag{6}

其中 pp 爲[0,1]之間的隨機數。

1.2.3搜索獵物(Search for prey)(exploration phase)

  除了泡泡網方法,座頭鯨還會隨機尋找獵物,同樣基於可變 A\vec{A} 向量,事實上,座頭鯨會根據彼此的位置進行隨機搜索,因此使用隨機值大於1或小於-1的 A\vec{A} 來迫使搜索代理遠離參考鯨魚。與利用階段相反,這裏將根據隨機選擇的搜索代理來更新搜索代理在探索階段的位置,而不是根據目前爲止最優的搜索代理。該機制和 A>1|\vec{A}|>1 強調了探索,並允許WOA算法執行全局搜索。數學模型如下:
D=CXrandX(7)\vec{D}=|\vec{C} \cdot {\overrightarrow X_{r a n d}}-\vec{X}|\tag{7}
X(t+1)=Xrand AD(8)\vec{X}(t+1)={\overrightarrow X_{\text {rand }}}-\vec{A} \cdot \vec{D}\tag{8}

其中 Xrand\overrightarrow X_{r a n d} 爲從當前種羣中選擇的隨機位置向量(表示一頭隨機鯨魚)。

  特定解附近滿足 A>1\vec{A}>1 的一些可能解如圖 4 所示。

圖4 WOA中的探索機制(X*是一個隨機選擇的搜索代理)

  WOA算法首先隨機初始化一組解,在每次迭代中,搜索代理根據隨機選擇的搜索代理或到目前爲止獲得的最優解更新它們的位置。將 aa 參數由 2 隨迭代次數降爲 0,從而由探索逐步到利用。當 A>1|\vec{A}|>1 時選擇隨機搜索代理,A<1|\vec{A}|<1 時選擇最優解更新搜索代理位置。根據 pp 的值,WOA可以在螺旋運動和圓環運動之間進行切換。最後,通過滿足終止準則來終止WOA算法。WOA算法的僞代碼如圖5所示。

圖5 WOA算法僞代碼

1.3 代碼分析

  只要明白了原理的基本流程,其實代碼就沒有說明困難了,咱們主要介紹一下如何實現上述分析的幾個重要原理,所要優化的問題的是三十個數的平方和最小((x2)\sum(x^2)

  1. 參數初始化。初始時主要設置代理數量和最大迭代次數即可,其他算法相關的參數因爲和當前迭代次數相關,需要在迭代中設置。
SearchAgents_no=30; % 搜索代理數量
Max_iteration=500; % 最大迭代次數
  1. 種羣初始化。隨機初始化所有代理各個維度上的位置值,需要保證在取值範圍內。
Positions=rand(SearchAgents_no,dim).*(ub-lb)+lb;
  1. 種羣評估。評估種羣中每個代理的目標值,如有某個代理由於當前最優解,則將其設爲最優解。
for i=1:size(Positions,1)
    % 計算每個代理的目標值
    fitness=fobj(Positions(i,:));
    % 更新最優解
    if fitness<Leader_score % 如果是最大化問題,這裏就是">"
        Leader_score=fitness; 
        Leader_pos=Positions(i,:);
    end
end
  1. 設置和迭代次數相關的算法參數
a=2-t*((2)/Max_iter); % 等式(3)中a隨迭代次數從2線性下降至0 
%a2從-1線性下降至-2,計算l時會用到
a2=-1+t*((-1)/Max_iter);
  1. 對每個代理的每一維度進行位置更新
% Update the Position of search agents 
for i=1:size(Positions,1)
    r1=rand(); % r1爲[0,1]之間的隨機數
    r2=rand(); % r2爲[0,1]之間的隨機數

    A=2*a*r1-a;  % 等式(3)
    C=2*r2;      % 等式(4)

    b=1;               %  等式(5)中的常數b
    l=(a2-1)*rand+1;   %  等式(5)中的隨機數l
    p = rand();        %  等式(6)中的概率p
    for j=1:size(Positions,2)
        if p<0.5   
            if abs(A)>=1
                rand_leader_index = floor(SearchAgents_no*rand()+1);
                X_rand = Positions(rand_leader_index, :);
                D_X_rand=abs(C*X_rand(j)-Positions(i,j)); % 等式(7)
                Positions(i,j)=X_rand(j)-A*D_X_rand;      % 等式(8)

            elseif abs(A)<1
                D_Leader=abs(C*Leader_pos(j)-Positions(i,j)); % 等式(1)
                Positions(i,j)=Leader_pos(j)-A*D_Leader;      % 等式(2)
            end
        elseif p>=0.5

            distance2Leader=abs(Leader_pos(j)-Positions(i,j));
            % 等式(5)
            Positions(i,j)=distance2Leader*exp(b.*l).*cos(l.*2*pi)+Leader_pos(j);
        end
    end
end
  1. 重複執行步驟3~步驟5
    程序運行結果如下:
圖6 優化結果

  可以看出對於一個30維度的單峯優化問題,算法可以很快的找到最優值值,感興趣的讀者也可以在源碼上運行自己想要的目標函數,這裏不再展示其他結果。

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