樽海鞘是一種透明的桶狀生物,和水母比較相似。它通過吸水、噴水來移動的。由於它生活在寒帶的深海里面,給我們的研究造成了一定的困擾。但是,這並不影響我們對它的研究。在深海里,樽海鞘是以樽海鞘鏈的形式存在,這就是我們感興趣的群體行為之一。
首先,我們將樽海鞘鏈分為兩組: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

