Единый кроссовер на Яве - PullRequest
       40

Единый кроссовер на Яве

0 голосов
/ 17 февраля 2012

У меня проблемы с внедрением единого кроссовера в Java. Это алгоритм;

// Uniform Crossover
public void UniformCrossover(Individual indi) {
  if (RVGA.rand.nextDouble() < pc) {

  // Put your implementation of uniform crossover here

  // For each gene create a random number in   [0,   1].
  // If the number is less than   0.5, swap the gene values in
  // the parents for this gene; other wise, no swapping .
}

Я знаю, что могу int tmp и сохранить случайное число, затем if tmp < 0.5 продолжить цикл

Мне не удалось начать, любая помощь приветствуется!

Это пример моего одноточечного кроссовера, чтобы вы знали мой формат.

Пересечение в одну точку - точка пересечения выбрана, двоичная строка от начала хромосомы до точки пересечения копируется из одного родителя, остальное копируется из второго родителя.

Родитель 1 = хромосома и Родитель 2 = инди.

Я превращаю родителей в детей на месте

public void onePointCrossover(Individual indi) {
    if (SGA.rand.nextDouble() < pc) {
        int xoverpoint = SGA.rand.nextInt(length);

        int tmp;
        for (int i=xoverpoint; i<length; i++){
            tmp = chromosome[i];
            chromosome[i] = indi.chromosome[i];
            indi.chromosome[i] = tmp;
        }   
    }   
}

1 Ответ

1 голос
/ 17 февраля 2012

С помощью равномерного кроссовера, в общем, вы хотите:

For each gene
  if rand()<0.5
    take from parent a
  else
    take from parent b

Вы, судя по вашему одноточечному примеру, модифицируете обоих родителей одновременноВ каком случае:

For each gene
  if rand()<0.5
    leave both parents alone
  else
    swap chromosome[i] with indi.chromosome[i] as before
...