Единый кроссовер в Java
-
26-10-2019 - |
Вопрос
У меня проблемы с внедрением единого кроссовера в 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;
}
}
}
Решение
С равномерным кроссовером, что вы хотите сделать в целом, так это:
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