进化策略与进化规划算法(ES与EP)
github: 智能算法的课件和参考资料以及实验代码 进化策略和遗传算法统称为进化算法,二者的思想很类似,但步骤和应用方向有所差别。具体关于这两种算法介绍可以下载课件查看 我们举个二元函数最大值优化问题,分别用这两种算法简单搜索最优值:用matlab实现:ES:f2.mfunction y = f2(x1, x2)% 二元函数求最大值的优化问题 x1∈[-3...
文章共1,443字 · 阅读需要大约5分钟
一键AI生成摘要,助你高效阅读
问答
·
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
更多推荐
已为社区贡献3条内容
所有评论(0)