2

我正在尝试为 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

有人看到问题了吗?

4

1 回答 1

0

你的突变有一个偏差:它们只能增加参数,永远不能减少它们。sigmap 是(缩放的)上减下限的向量:全部为正。exp(...) 总是积极的。因此,Osigma 的元素总是积极的。那么你的变化就是 Osigma .* rand(N,1),而 rand(N,1) 也总是正数。

您是否可能打算使用 randn(N,1) 而不是 rand(N,1)?通过单字符更改,我发现您的代码优化而不是悲观:-)。

于 2011-02-05T22:28:48.900 回答