github: 智能算法的课件和参考资料以及实验代码

 

进化策略和遗传算法统称为进化算法,二者的思想很类似,但步骤和应用方向有所差别。

具体关于这两种算法介绍可以下载课件查看

 

我们举个二元函数最大值优化问题,分别用这两种算法简单搜索最优值:

用matlab实现:

ES:

f2.m

function y = f2(x1, x2)
% 二元函数求最大值的优化问题 x1∈[-3.0, 12.1], x2∈[4.1, 5.8]
y = 21.5 + x1 * sin(4 *pi * x1) + x2 * sin(20 * pi * x2);

ES.m

clear
clc
N=10; % 初始种群规模
x1=15.1*rand(1,N)-3; 
x2=1.7*rand(1,N)+4.1;
X=[x1;x2]; % 生成初始种群矩阵,一列表示一个可行解
sigma=rand(2,N);
T=50; % 迭代次数
maxf=0; % 记录最大适应度
for t=1:T
       lamda=1;
       while lamda<=7*N
           pos=1+fix(rand(1,2)*(N-1)); % [1,9]范围的二元行向量 此处范围错误,应为[1, 10]
        % pa1、pa2分别是X中的一个随机解,可能相同
           pa1=X(:,pos(1));
           pa2=X(:,pos(2));
           % 随机选出x1
           if rand()<0.5
               o(1)=pa1(1); 
           else
               o(1)=pa2(1);
           end
           % 随机选出x2
           if rand()<0.5
               o(2)=pa1(2);
           else
               o(2)=pa2(2);
           end
           % 随机从sigma矩阵中选出两列,相加求平均,sigmal是一个二元列向量,范围(0,1)
           sigma1=0.5*(sigma(:,pos(1))+sigma(:,pos(2))); 
           % o是已知解x1, x2的随机组合,也是一组解[x1,x2]
           Y=o+sigma1.*randn(2,1);
           % Y这个解可能会超出范围 x1,x2
           if Y(1)>=-3 && Y(1)<=12.1 && Y(2)>=4.1 && Y(2)<=5.8
           	% 保存选择出来的个体,个体数目lamda+1
               offspring(:,lamda)=Y; % 保存选择出来的子代
               lamda=lamda+1; 
           end
       end
       U=[offspring]; %70个解组成的矩阵 这里是u,λ策略
       % μ+λ选择策略: 在原有的μ个个体和新生成的λ个体中选择
       % u,λ选择策略: 从新生成的λ个体中选择 ,建议λ/μ = 7
       % μ/λ是压力比,其越大选择压力越大。
       % u + λ策略改为U=[offspring, X]
       % size(U, 2) 为U向量的列数,也就是子代数目
       for i=1:size(U,2)
           temp = U(:,i);
           x1 = temp(1);
           x2 = temp(2);
           eva(i)=f2(x1, x2);
       end
       % m_eval是排序的适应度值,从小到大,I是对应的适应值原来的下标
       [m_eval,I]=sort(eva);
       I1=I(end-N+1:end); % end-(end-N+1)+1从7*N子代中选出最好的N个的适应度下标行向量
       X=U(:,I1); % 得到7*N中最好的N个个体
       % 比较最大适应度与maxf记录值,更新maxf,同时记录x1,x2值
       if m_eval(end)>maxf
           maxf=m_eval(end);
           opmx=U(:,end);
       end
       max_f(t)=maxf;
       mean_f(t)=mean(eva(I1)); % 计算每代平均适应度
end
plot(1:T,max_f,'b',1:T,mean_f,'g')
opmx
maxf

% result: x1 = 10.4391, x2 = 5.5460, maxf = 38.1892 

可以看到结果接近最优值

 

EP:

f1.m

function y = f1(X)
%f1 此处显示有关此函数的摘要
%   此处显示详细说明
x1 = X(1);
x2 = X(2);
y = 21.5 + x1 * sin(4 * pi * x1) + x2 * sin(20 * pi * x2);
end

EP.m

clear
clc
N=20; % 初始种群数量
x1=15.1*rand(1,N)-3;
x2=1.7*rand(1,N)+4.1;
X=[x1;x2];
sigma=[3;3]; 
gen=1; % 代数
maxf=0; % 记录种群中最大适应度
while gen<100
       i=0;
       while i<N
           if sigma(1)<0
              sigma(1)=0.001;
           else
              sigma(1)=sigma(1)+sqrt(sigma(1))*randn(1);
           end
           if sigma(2)<0
              sigma(2)=0.001;
           else
              sigma(2)=sigma(2)+sqrt(sigma(2))*randn(1);
           end
              X0=X(:,i+1)+sigma*randn(1); %对每个个体周围进行探索
              % 判断是否探索越界
              if  X0(1)>=-3 && X0(1)<=12.1 && X0(2)>=4.1 && X0(2)<=5.8
              	Y(:,i+1)=X0; % Y保存下一代
              	i=i+1;
              end
       end
       Temp=[X,Y]; % 父母代和子代2N数量
       W=zeros(1,2*N);
       % p是随机选择的,优良个体进入下一代的机会会大些,但是也有较差的个体会进入,建议p=0.9μ
       % 随机型p竞争法 
       % (1) 从μ个父代和μ个子代中,依此选出一个个体i
       % (2) 从2μ个个体中,随机选择p个个体
       % (3) 比较个体i与p个个体适应度的优劣,记录个体i的适应度优于或者等于p个体的次数
       %     作为i的得分Wi
       % (4) 依次评价完2μ个个体
       % (5) 对W进行排序,选出前μ个个体作为下一代
       for j=1:2*N
           p=0;
           while p<N/2
           	% 随机从种群中选出一个个体比较适应度
               k=1+fix((2*N-1)*rand()); % k属于2*N-1
               if k~=j
                   p=p+1;
                   if f1(Temp(:,j))>f1(Temp(:,k))
                       W(j)=W(j)+1; % 如果大于就累加1
                   end
               end
           end
       end
       [W1,In]=sort(W); % 将适应度累加值从小到大排序
       I1=In(N+1:2*N); % 选出最大适应度累加值的个体索引
       X=Temp(:,I1); % 选出来的N个比较好的个体
       gen=gen+1; % 迭代次数+1
       maxW=f1(X)
       % 更新maxf,及最优解
       if  maxW>maxf
           maxf=maxW;
           opmx=Temp(:,In(end)); % 选出此代适应度最优解
       end
       mean_f(gen)=mean(W(I1)); % 此代平均适应度累加值
       fit(gen)=maxf;
end
opmx
maxf
plot(1:gen,fit,1:gen,mean_f)

% result: x1 = 11.6253, x2 = 5.7250, maxf = 38.8485

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐