Двухточечный кроссовер в Java - PullRequest
0 голосов
/ 16 февраля 2012

Я реализовал одноточечное пересечение следующим образом:

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 = хромосома, а Родитель 2 = инди.

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

Теперь мне нужно также сделатьдвухточечное пересечение, но с некоторыми проблемами, это то, что я имею до сих пор, но я считаю, что нижняя половина кода делает то же самое, что и одноточечное пересечение, а не переставляет средние секции.

       public void twoPointCrossover(Individual indi) {
        if (SGA.rand.nextDouble() < pc) {

            int xoverpoint = SGA.rand.nextInt(length);
            int xoverpoint2 = SGA.rand.nextInt(length);



            int tmp;

            if (xoverpoint > xoverpoint2){
                tmp = xoverpoint;
                xoverpoint = xoverpoint2;
                xoverpoint2 = tmp;
            }

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

Это не кажется правильным, и любая помощь будет оценена по достоинству!Спасибо!

Ответы [ 2 ]

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

Вы должны проверить i < (or <=) xoverpoint2 вместо i<length в цикле.

0 голосов
/ 21 мая 2018

Я сейчас работаю над той же проблемой. Вот мое решение:

// Two-Point Crossover function
public Genome twoPtCrossover(Genome partner) {
    Genome child = new Genome(partner.genome.length);

    int crosspoint1 = xd.nextInt(genome.length);
    int crosspoint2 = xd.nextInt(genome.length);

    // Ensure crosspoints are different...
    if (crosspoint1 == crosspoint2){
        if(crosspoint1 == 0){
            crosspoint2++;
        } else {
            crosspoint1--;
        }
    }
    // .. and crosspoint1 is lower than crosspoint2
    if (crosspoint2 < crosspoint1) {
        int temp = crosspoint1;
        crosspoint1 = crosspoint2;
        crosspoint2 = temp;
    }

    for (int i = 0; i < genome.length; i++) {
        if (i < crosspoint1 || i > crosspoint2)
            child.genome[i] = genome[i];
        else
            child.genome[i] = partner.genome[i];
    }
    return child;
}
...