Exchanging elements (crossover) between two vector

2019-07-11 14:11发布

问题:

Assume I have:

chromosome_1 <- c('0010000001010000')

chromosome_2 <- c('0100000001001010')

How can I implement step 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. Generate a random integer NC from range(1, M)
  3. Randomly select NC gene positions among the genes with allele “1” from chromosome_1 and form a set s1 of indices of such selected positions.

    Randomly select NC gene positions among the genes with allele “1” from chromosome_2 and form a set s2 of indices of such selected positions.

  4. s = union(s1, s2) Assume s = 2, 3, 10, 15

  5. for each index i in s

    Exchange the alleles of chromosomes chromosome_1 and chromosome_2 at gene position i.

The following illustrates the outcome:

I would really really appreciate any help!

回答1:

You can try with GA package:

In Manual (page 5), there is an example.

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)

In example, population, selection, crossover, mutation and monitor operators assign new functions. In my study, I used own mutation and monitor functions. For example;

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) {
#...
}

So, you just define your own function and give the function name to ga function. In order to be reference, you can see default functions. You can see necessary parameters and return values in default functions.



回答2:

Might not be the simplest solution, but it works

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