Обмен элементами (кроссовер) между двумя векторами

Предположим, у меня есть:

chromosome_1 <- c('0010000001010000')

chromosome_2 <- c('0100000001001010')

Как реализовать шаги 3–5?

  1. Evaluate
    • NC1 = no. of 1's in chromosome_1
    • NC2 = no. of 1's in chromosome_2
    • M = min(NC1, NC2)
  2. Сгенерировать случайное целое число NC из range(1, M)
  3. Произвольно выбрать NC позиций генов среди генов с аллелем «1» из chromosome_1 и сформировать набор s1 индексов таких выбранных позиций.

    Произвольно выбрать NC позиций генов среди генов с аллелем «1» из chromosome_2 и сформировать набор s2 индексов таких выбранных позиций.

  4. s = union(s1, s2) Предположим s = 2, 3, 10, 15

  5. для каждого индекса i в s

    Обмен аллелями хромосом chromosome_1 и chromosome_2 в положении гена i.

Следующее иллюстрирует результат:

введите здесь описание изображения

Я был бы очень признателен за любую помощь!


person jacky_learns_to_code    schedule 20.01.2017    source источник


Ответы (2)


Вы можете попробовать с пакетом GA:

В Руководстве (стр. 5) есть пример.

ga(type = c("binary", "real-valued", "permutation"),
fitness, ...,
min, max, nBits,
population = gaControl(type)$population,
selection = gaControl(type)$selection,
crossover = gaControl(type)$crossover,
mutation = gaControl(type)$mutation,
popSize = 50,
pcrossover = 0.8,
pmutation = 0.1,
elitism = base::max(1, round(popSize*0.05)),
updatePop = FALSE,
postFitness = NULL,
maxiter = 100,
run = maxiter,
maxFitness = Inf,
names = NULL,
suggestions = NULL,
optim = FALSE,
optimArgs = list(method = "L-BFGS-B",
poptim = 0.05,
pressel = 0.5,
control = list(fnscale = -1, maxit = 100)),
keepBest = FALSE,
parallel = FALSE,
monitor = if(interactive())
{ if(is.RStudio()) gaMonitor else gaMonitor2 }
else FALSE,
seed = NULL)

Например, операторы популяции, отбора, скрещивания, мутации и мониторинга назначают новые функции. В своем исследовании я использовал собственные функции мутации и мониторинга. Например;

myga <- ga(type = "binary",
fitness, ...,
min, max, nBits,
mutation = myMutationFunction
popSize = 50,
pcrossover = 0.8,
pmutation = 0.1,
maxiter = 100,
run = maxiter,
monitor = myMonitorFunction

myMutationFunction <- function (x) {
#...
}

myMonitorFunction <- function (x) {
#...
}

Итак, вы просто определяете свою собственную функцию и даете имя функции ga function. Для справки вы можете увидеть функции по умолчанию. Вы можете увидеть необходимые параметры и возвращаемые значения в функциях по умолчанию.

person akadal    schedule 21.01.2017
comment
извините за путаницу, я отредактировал свой вопрос, чтобы прояснить ситуацию. Обращаясь к странице 21 руководства, обратите внимание, что функция кроссовера принимает два аргумента, object и parents, что они означают? - person jacky_learns_to_code; 21.01.2017

Возможно, это не самое простое решение, но оно работает

set.seed(12345)

## Step 1
a <- c(0,0,1,0,0,0,0,0,0,1,0,1,0,0,0,0)
b <- c(0,1,0,0,0,0,0,0,0,1,0,0,1,0,1,0)
m <- min(sum(a==1), sum(b==1))

## Step 2
random_int <- sample(1:m, 1)

## Step 3
random_a <- sample(which(a == 1), random_int)
random_b <- sample(which(b == 1), random_int)
#all <- sort(union(random_a, random_b))

## Step 4
## for demo purpose (assume it as the random output)
all <- c(2,3,10,15)     

temp_a <- a[all]
temp_b <- b[all]

## Step 5
##crossover
b[all] <- temp_a
a[all] <- temp_b

## Output
> a
 [1] 0 1 0 0 0 0 0 0 0 1 0 1 0 0 1 0
> b
 [1] 0 0 1 0 0 0 0 0 0 1 0 0 1 0 0 0
person jacky_learns_to_code    schedule 02.02.2017