clc
clear
foj = @ Sphere;
Lb = -100; % 搜索空間下界
Ub = 100; % 搜索空間上界
N_iter = 1000; % 最大迭代次數
n_pop = 50; % 種群個數
d = 10; % 種群維度
beta = 3;
gamma = 0.1;
Z = zeros(n_pop, d);
% 隨機生成一個d維向量
Z(1, :) = rand(1, d);
% 利用logistic生成n_pop個向量
for i=2:n_pop
Z(i,:) = 4.0*Z(i-1,:).*(1-Z(i-1,:));
end
% 將z的各個分量載波到對應變量的取值區間
pop = zeros(n_pop, d);
fitness = zeros(n_pop, 1);
for i=1:n_pop
pop(i,:) = Lb + (Ub - Lb)*Z(i,:);
fitness(i) = foj(pop(i,:));
end
mu = mean(pop, 1);
figure
scatter(pop(:,1), pop(:,2), 'r*');
hold on
scatter(mu(:,1), mu(:,2),'ko');
box on
[bestScore, loc] = min(fitness);
bestPop = pop(loc, :); % 當前種群中食物數目最多的位置
S = pop; % S是更新后的種群
fmin = zeros(N_iter,1);
for t=1:N_iter
for i=1:n_pop
c = abs((1-t/N_iter)*(2*rand-1));
if c>=0.5
% 洋流位置更新公式
trend = bestPop - beta*rand*mu; % 洋流的方向,即論文中的公式.9
S(i,:) = pop(i,:) + rand(1,d).*trend; % 水母位置更新,即論文中的公式.11
else
% 種群內部運動
if rand>(1-c)
S(i,:) = pop(i,:) + gamma*rand(1,d).*(Ub - Lb); % 被動運動,即論文公式.12
else
JK = randperm(n_pop);
if foj(pop(JK(1)))>=foj(pop(JK(2)))
Direction = pop(JK(2),:) - pop(JK(1),:);
else
Direction = pop(JK(1),:) - pop(JK(2),:);
end
Step = rand(1, d).*Direction;
S(i,:) = pop(i,:) + Step; % 主動運動,論文公式.16
end
end
% 檢查邊界
S(i,:) = simpleBound(S(i,:), Lb, Ub);
Fnew = foj(S(i,:));
% 判斷是否更新相應位置和適應度值
if Fnew<fitness(i)
fitness(i) = Fnew;
pop(i,:) = S(i,:);
end
% 判斷是否更新最優值
if Fnew<bestScore
bestScore = Fnew;
bestPop = S(i,:);
end
end
fmin(t) = bestScore;
% 命令窗口輸出
disp(['Iteration ' num2str(t) ': Best Cost = ' num2str(bestScore)]);
% disp(['Bestpop ' num2str(bestPop)]);
end
figure
semilogy(fmin, 'r-.')

function x=simpleBound(x,Lb,Ub)
% 函數名稱:越界處理函數
% param x:水母
% param Lb:變量下界
% param Ub:變量上界
d = length(x);
for i=1:d
if x(i) > Ub
x(i) = (x(d) - Ub) + Lb;
elseif x(i) < Lb
x(i) = (x(d) - Lb) + Ub;
end
end
end
function [y] = Sphere(xx)
d = length(xx);
sum = 0;
for ii = 1:d
xi = xx(ii);
sum = sum + xi^2;
end
y = sum;
end