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); endEP.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