樽海鞘是一種透明的桶狀生物,和水母比較相似。它通過吸水、噴水來移動的。由於它生活在寒帶的深海里面,給我們的研究造成了一定的困擾。但是,這並不影響我們對它的研究。在深海里,樽海鞘是以樽海鞘鏈的形式存在,這就是我們感興趣的群體行為之一。
首先,我們將樽海鞘鏈分為兩組:1、領導者;2、追隨者。
領導者就是樽海鞘鏈前端的部分;追隨者就是樽海鞘鏈后端的部分。
首先,領導者的位置跟新公式:
最后,更新追隨者位置
為了不誤導大家,我給直接給出結果
clc; clear all; close all; %% 問題定義 CostFunction = @(x) sphere(x); % 目標函數 nVar = 5; % 變量的維數 VarSize = [1,nVar]; % 變量的矩陣大小 VarMin = -10; % 變量的下確界 VarMax = 10; % 變量的上確界 %% SSA參數 MaxIt = 1000; % 最大迭代次數 nPop = 50; % 種群大小 %% 初始化 % 樽海鞘模板 empty_slaps.Position = []; empty_slaps.Cost = []; empty_slaps.Best.Position = []; empty_slaps.Best.Cost = []; % 創建種群數組 slaps = repmat(empty_slaps,nPop,1); % 初始化食物的適應度 Food.Cost = inf; % 初始化種群 for i=1:nPop % 生成隨機解 slaps(i).Position = unifrnd(VarMin,VarMax,VarSize); % 評價 slaps(i).Cost = CostFunction(slaps(i).Position); % 更新最優個體 slaps(i).Best.Position = slaps(i).Position; slaps(i).Best.Cost = slaps(i).Cost; % 更新食物的位置 if slaps(i).Best.Cost < Food.Cost Food = slaps(i).Best; end end BestCosts = zeros(MaxIt,1); %% SSA算法的主程序 it = 1; while it < MaxIt+1 c1 = 2*exp(-(4*it/MaxIt)^2); % 設置參數 for i=1:nPop if i <= nPop/2 c2=rand(); c3=rand(); %%%%%%%%%%%%% % Eq. (3.1) in the paper %%%%%%%%%%%%%% if c3<0.5 slaps(i).Position =Food.Position + c1*((VarMax - VarMin)*c2 + VarMin); else slaps(i).Position =Food.Position - c1*((VarMax - VarMin)*c2 + VarMin); end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% elseif i > nPop/2 && i < nPop+1 point1 = slaps(i-1).Position; point2 = slaps(i).Position; slaps(i).Position = (point2 + point1)/2; end end for i=1:nPop slaps(i).Position = max(slaps(i).Position,VarMin); slaps(i).Position = min(slaps(i).Position,VarMax); slaps(i).Cost = CostFunction(slaps(i).Position); % 計算每個體的適應度值 if slaps(i).Cost < slaps(i).Best.Cost slaps(i).Best.Position = slaps(i).Position; slaps(i).Best.Cost = slaps(i).Cost; if slaps(i).Best.Cost < Food.Cost Food = slaps(i).Best; end end end BestCosts(it) = Food.Cost; disp(['Iteration ' num2str(it) ': Best Cost = ' num2str(BestCosts(it))]); it = it + 1; end %% Results figure; % plot(BestCosts,'LineWidth',2); semilogy(BestCosts,'LineWidth',2); xlabel('Iterations'); ylabel('Best Cost'); grid on;
function z = sphere(x) %% 目標函數 z = sum(x.^2); end