Вы можете сделать это следующим образом:
offspring <- c(0,1,0,1,1,0,1,1,0,1)
# given an offspring vector (e.g. 0,1,0,0,1,0)
# choose 2 cut points AB and invert the values between them
getNewOffspring <- function(offspring){
AB <- sort(sample.int(length(offspring),2))
if(AB[2] - AB[1] > 2){
subSqIdxs <- seq.int(from=AB[1]+1,to=AB[2]-1)
offspring[subSqIdxs] <- rev(offspring[subSqIdxs])
}
offspring
}
Пример использования:
getNewOffspring(c(0,1,0,1,1,0,1,1,0,1))
# e.g. with AB being 3,8
> 0 1 0 1 0 1 1 1 0 1
РЕДАКТИРОВАТЬ:
Предполагая, что список потомков хранится в списке под названиемoffspringsList
вы можете извлечь случайное число для каждого потомства, чтобы решить, какой из них должен быть видоизменен, а затем вызвать предыдущую функцию:
offspringsToMutate <- which(runif(lenght(offspringsList)) > pM)
for(offspringIndex in seq_len(length(offspringsToMutate))){
mutated <- getNewOffspring(offspringsList[[offspringIndex]])
offspringsToMutate[[offspringIndex]] <- mutated
}
# now the list contains the mutated offsprings