Matlab+GA: имитация двоичного кроссовера (SBX) не может генерировать желаемое распределение потомства

В некоторых ссылках я обнаружил, что распределение потомков SBX должно иметь следующую форму для двухмерных векторов: введите описание изображения здесь

Однако моя реализация отличается от этой формы:

    par1 = [.2; .2];
par2 = [.8; .8];
eta = 15;
child1 = zeros(2,1);
child2 = child1;
hold on
for k = 1:100
    for i = 1:2
      u = rand;
      if (u<0.5)
          beta=(2*u)^(1/(eta+1));
      elseif (u>0.5)
          beta=(0.5/(1-u))^(1/(eta+1));
      elseif (u == .5)
          beta = 1;
      end
      c1(i) = 0.5*(par1(i)+par2(i)) - 0.5*beta*abs(par1(i)-par2(i));
      c2(i) = 0.5*(par1(i)+par2(i)) + 0.5*beta*abs(par1(i)-par2(i));

    end
    plot([c1(1), c2(1)], [c1(2), c2(2)], 'b.')

end

Вот мой вывод: введите описание изображения здесь, я думаю, что моя реализация верна, но я не знаю, почему я не могу достичь этой желаемой цифры.

1 ответ

Причина в том, что вам нужно реализовать отражения, проверьте код nsga-ii от автора Deb. Есть два дополнительных действия: поменять местами переменные с вероятностью (0,5) и наследовать родительские переменные напрямую с определенной вероятностью. С уважением Жоэль Chacón Кастильо

Другие вопросы по тегам