我正在尝试使用30维最小化问题的进化策略找到一个好的解决方案。现在我已经成功开发了一个简单的(1,1)ES以及一个步长的自适应(1,lambda)ES。
下一步是创建一个(1,lambda)ES,每个维度具有单独的步长。问题是我的MATLAB代码还没有工作。我正在测试球体目标函数:
function f = sphere(x)
f = sum(x.^2);
end
具有一步大小的ES与具有单独步长的ES的绘制结果:
蓝线是具有单个步长的ES的性能,红色的是具有一步大小的ES。
具有多个步长的(1,lambda)ES的代码:
% Strategy parameters
tau = 1 / sqrt(2 * sqrt(N));
tau_prime = 1 / sqrt(2 * N);
lambda = 10;
% Initialize
xp = (ub - lb) .* rand(N, 1) + lb;
sigmap = (ub - lb) / (3 * sqrt(N));
fp = feval(fitnessfct, xp');
evalcount = 1;
% Evolution cycle
while evalcount <= stopeval
% Generate offsprings and evaluate
for i = 1 : lambda
rand_scalar = randn();
for j = 1 : N
Osigma(j,i) = sigmap(j) .* exp(tau_prime * rand_scalar + tau * randn());
end
O(:,i) = xp + Osigma(:,i) .* rand(N,1);
fo(i) = feval(fitnessfct, O(:,i)');
end
evalcount = evalcount + lambda;
% Select best
[~, sortindex] = sort(fo);
xp = O(:,sortindex(1));
fp = fo(sortindex(1));
sigmap = Osigma(:,sortindex(1));
end
有人看到了这个问题吗?
答案 0 :(得分:0)
你的突变有偏见:它们只能增加参数,永远不会减少它们。 sigmap是(缩放)上部减去下限的向量:全部为正。 exp(...)总是积极的。因此,Osigma的元素总是积极的。然后你的变化是Osigma。* rand(N,1)和rand(N,1)也总是正面的。
您是否意味着使用randn(N,1)而不是rand(N,1)?通过单字符更改,我发现您的代码优化而非悲观: - )。