在两个向量之间交换元素(交叉) [英] Exchanging elements (crossover) between two vectors
问题描述
假设我有:
chromosome_1 <- c('0010000001010000')
chromosome_2 <- c('0100000001001010')
如何实现 第3-5步 ?
How can I implement step 3-5 ?
- 评估
- NC1 =否.
chromosome_1
中1的个
- NC2 =否.
chromosome_2
中1的个
- M =
min(NC1, NC2)
- NC1 =否.
- Evaluate
- NC1 = no. of 1's in
chromosome_1
- NC2 = no. of 1's in
chromosome_2
- M =
min(NC1, NC2)
- NC1 = no. of 1's in
从基因中随机选择NC
个基因位置
与来自chromosome_1
的等位基因"1"并形成索引为s1
的集合
这样的职位.
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.
从基因中随机选择NC
个基因位置
来自chromosome_2
的等位基因"1"并形成索引为s2
的一组
这样的职位.
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.
s = union(s1, s2)
假设 s = 2, 3, 10, 15
对于s
在以下位置交换染色体chromosome_1
和chromosome_2
的等位基因
基因位置i
.
Exchange the alleles of chromosomes chromosome_1
and chromosome_2
at
gene position i
.
以下说明了结果:
真的很感谢您的帮助!
推荐答案
可能不是最简单的解决方案,但它可行
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
这篇关于在两个向量之间交换元素(交叉)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!