function [fit_best,X_best,Convergence_curve] = SSA1(N,M,c,d,dim,fobj )
%pop是种群,M是迭代次数,fobj是用来计算适应度的函数,dim为函数维度
N_dis=0.2*N; % 发现者个数
% N_fol=0.8*N; % 追随者个数
% N_vig=0.1*N; % 警戒者个数
lb = c.*ones(1,dim); % Lower limit/bounds/ a vector
ub = d.*ones(1,dim); % Upper limit/bounds/ a vector
%% 初始化
for i = 1:N
x(i,:) = lb+(ub-lb).*rand(1,dim); % 初始化麻雀种群 Equation (1)
fit(i) = fobj(x(i,:)); % 计算麻雀种群的适应度值 Equation (2)
end
pFit = fit;
pX = x; % 与pFit相对应的个体最佳位置
[value,index] = sort(pFit); % 分类
fit_best = value(1); % fit_best表示全局最优适应值
X_best = x(index(1),:); % X_best表示对应于fit_best的全局最优位置
fit_worst = value(end); % fit_best表示全局最差适应值
X_worst = x(index(end),:); % X_worst表示对应于fit_best的全局最差位置
r2=rand(1); % 预警值
alpha=rand(1);
ST = 0.8; % 安全阈值
% x_dis=x(index(1:N_dis),:); %发现者位置
% x_fol=x(index(N_dis+1:N),:); %追随者位置
% x_vig=x(index(1:N_vig),:); %警戒者位置
%% Start updating the solutions
for t = 1:M
%%%%%%%%%%%%%%%%%%%%%%%%%这一部位为发现者(探索者)的位置更新%%%%%%%%%%%%%%%%%%%%%%%%%
for i = 1:N_dis % Equation (3)
% for j = 1:dim
if(r2<ST)% 预警值小于安全阈值,说明没有捕食者出现
x(index(i),:) = x(index(i),:)*exp(-(i)/(alpha*M));% 对自变量做一个随机变换
else % 预警值大于安全阈值,说明有捕食者出现威胁到了种群的安全,需要去其它地方觅食
x(index(i),:) = pX(index(i),:)+randn(1)*ones(1,dim);
end
x(index(i),:) = Bounds(x(index(i),:),lb,ub);%对超过边界的变量进行去除
fit(index(i),:) = fobj(x(index(i),:));% 计算新的适应度值
% end
end
[~,bestII] = min(fit);
X_p = x(bestII,:);%位置更新后,发现者的占据的最优位置,即最优发现者位置
%%%%%%%%%%%%%%%%%%%%%%%%%这一部位为加入者(追随者)的位置更新%%%%%%%%%%%%%%%%%%%%%%%%%
for i = (N_dis+1):N %剩下20-100的个体的变换 % Equation (4)
% for j = 1:dim
A = floor(rand(1,dim)*2)*2-1;
if(i>(N/2)) %这个代表这部分麻雀处于十分饥饿的状态(因为它们的能量很低,也是是适应度值很差),需要到其它地方觅食
x(index(i),:)=randn(1)*exp((X_worst-pX(index(i),:))/(i)^2);
else %这一部分追随者是围绕最好的发现者周围进行觅食,其间也有可能发生食物的争夺,使其自己变成生产者
x(index(i),:)=X_p+(abs((pX(index(i),:)-X_p)))*(A'*(A*A')^(-1))*ones(1,dim);
end
x(index(i),:) = Bounds(x(index(i),:),lb,ub); %判断边界是否超出
fit(index(i),:) = fobj(x(index(i),:)); %计算新的适应度值
% end
end
%%%%%%%%%%%%%%%%%%%%%%%%这一部位为意识到危险(注意这里只是意识到了危险,不代表出现了真正的捕食者)的麻雀的位置更新%%%%%%%%%%%%%%%%%%%%%%%%%
c=randperm(numel(index));%%%%%%%%%这个的作用是在种群中随机产生其位置(也就是这部分的麻雀位置一开始是随机的,意识到危险了要进行位置移动,
%处于种群外围的麻雀向安全区域靠拢,处在种群中心的麻雀则随机行走以靠近别的麻雀)dex));
b=index(c(1:20));
for i = 1:length(b) % Equation (5)
if(pFit(index(b(i)))>(fit_best)) %处于种群外围的麻雀的位置改变
x(index(b(i)),:)=X_best+(randn(1,dim)).*(abs((pX(index(b(i)),:)-X_best)));
elseif(pFit(index(b(i)))==(fit_best))%处于种群中心的麻雀的位置改变
x(index(b(i)),:) =pX(index(b(i)),:)+(2*rand(1)-1)*(abs(pX(index(b(i)),:)-X_worst))/(pFit(index(b(i)))-fit_worst+1e-50);
end
x(index(b(i)),:) = Bounds(x(index(b(i)),:),lb,ub);
fit(index(b(i))) = fobj( x(index(b(i)),:));
end
for i = 1:N % 如果新位置比以前更好,请更新它
if (fit(i)<pFit(i))
pFit(i) = fit(i);
pX(i,:) = x(i,:);
end
if(pFit(i)<fit_best)
fit_best = pFit(i);
X_best = pX(i,:);
end
end
Convergence_curve(t)=fit_best;
end
%% Application of simple limits/bounds
function s = Bounds(s,Lb,Ub)
% Apply the lower bound vector
temp = s;
I = temp < Lb;
temp(I) = Lb(I);
% Apply the upper bound vector
J = temp > Ub;
temp(J) = Ub(J);
% Update this new move
s = temp;
Sou^
- 粉丝: 0
- 资源: 5
最新资源
- 技术资料分享wav音频格式很好的技术资料.zip
- 技术资料分享WAV文件格式分析与应用很好的技术资料.zip
- 技术资料分享wav文件格式分析详解很好的技术资料.zip
- 技术资料分享VS1053-cn很好的技术资料.zip
- 技术资料分享VS1003-cn很好的技术资料.zip
- 技术资料分享UM0424-STM32F10xxx-USB-development-kit-en很好的技术资料.zip
- 网络管理与维护:Windows故障转移群集实现高可用文件服务器实训指南
- 技术资料分享uip在单片机上的移植精讲很好的技术资料.zip
- 技术资料分享uip-中文资料很好的技术资料.zip
- 技术资料分享ucos教程很好的技术资料.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
- 1
- 2
- 3
- 4
前往页