人群搜索算法SOA算法-MATLAB

这是基于MATLAB===>针对Sphere函数的SOA算法

clc;
clear all;
close all;
format long
%参数
sizepop = 100;
maxgen = 100;  
m = 10;
Umax = 0.9500;
Umin = 0.0111;
Wmax = 0.9;
Wmin = 0.1;
popmax = 15;
popmin = -15;

%初始化种群个体
for i =1:sizepop
   pop(i,:) = 15*rands(1,10); %要求在区间(a,b)内产生均匀分布的随机数  r = a + (b-a).*rand([m,n]);
   fitness(i) = Sphere(pop(i,:));
end
%寻找具有最好适应度的个体
[bestfitness bestindex] = max(fitness);
zbest = pop(bestindex,:);
gbest=pop;
fitnessgbest = fitness;
fitnesszbest = bestfitness;
%% 迭代寻优
Di = 0*rand(sizepop,m);
Di(i,:) = 1;
Buchang = 0*rand(sizepop,m);
C = 0*rand(sizepop,m);
Diego = 0*rand(sizepop,m);
Dialt = 0*rand(sizepop,m);
Dipro = 0*rand(sizepop,m);
yy(1) = fitnesszbest;
for t = 2:maxgen
   for i = 1:sizepop
      W = Wmax-t*(Wmax-Wmin)/maxgen;
      Diego(i,:) = sign(gbest(i,:) - pop(i,:));
      Dialt(i,:) = sign(zbest - pop(i,:));
      if Sphere(gbest(i,:)) >= Sphere(pop(i,:))
         Dipro(i,:) = -Di(i,:);
      else
          Dipro(i,:) = Di(i,:);
      end
      Di(i,:) = sign(W*Dipro(i,:) + rand*Diego(i,:) + rand*Dialt(i,:));
      [Orderfitnessgbest,Indexfitnessgbest] = sort(fitnessgbest,'descend');
      u = Umax - (sizepop - Indexfitnessgbest(i))*(Umax - Umin)/(sizepop -1);
      U = u + (1-u)*rand;
      H(t) = (maxgen - t)/maxgen;
      C(i,:) = H(t)*abs(zbest - 5*rands(1,10));
      T = sqrt(-log(U));
      Buchang(i,:) = C(i,:)*T;
      Buchang(i,find(Buchang(i,:) > 3*max(C(i,:)))) = 3*max(C(i,:));
      Buchang(i,find(Buchang(i,:) < 0)) = 0;
      %更新位置
      pop(i,:) = pop(i,:) + Di(i,:).*Buchang(i,:);
      pop(i,find(pop(i,:) > popmax)) = popmax;
      pop(i,find(pop(i,:) < popmin)) = popmin;
      fitness(i) = Sphere(pop(i,:));
      %个体最优更新
      if fitness(i) < fitnessgbest(i)
          gbest(i,:) = pop(i,:);
          fitnessgbest(i) = fitness(i);
      end
      %群体最优更新
      if fitness(i) < fitnesszbest
          zbest = pop(i);
          fitnesszbest = fitness(i);
      end
   end
   yy(t) = fitnesszbest;
end

%% 结果分析
plot(yy,'LineWidth',4)
title(['适应度曲线 ''终止代数=' num2str(maxgen)]);
xlabel('进化次数');
ylabel('适应度');
function y = Sphere(x)
y=x(1)^2+x(2)^2+x(3)^2+x(4)^2+x(5)^2+x(6)^2+x(7)^2+x(8)^2+x(9)^2+x(10)^2;
  • 3
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值