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