【发布时间】:2013-10-04 15:37:00
【问题描述】:
在进化/遗传算法中有多种重组方法。它们中的大多数都存在与染色体长度相关的偏差(也称为位置偏差)。
Uniform crossover 和shuffle crossover 可以解决这个问题。但是,我不明白两者的区别,如果在统一交叉的情况下p(c)=0.5
解释
- 通过与
p(c)=0.5的统一交叉,每个基因都是可能的 交叉点。 - 使用 shuffle crossover,染色体序列首先被打乱 (统一),然后分配一个交叉点,最后 原始染色体序列被恢复 - 这实际上意味着尽管只发生了一次交叉,但它可能会独立影响染色体中的每个位置。
由于这两种方法都涉及完全随机化,我看不出结果应该不同的原因。
我想确切地知道,因此我编写了一个小脚本来测试这两种机制。这里有一些 R 代码,如果你想自己尝试一下
parent1 <- rep(0, 10000) # 10.000 genes in the chromosome - change at will
parent2 <- rep(1, length(parent1))
# Uniform crossover
offspring1_unif <- rep(-1, length(parent1)) # initialize offspring1_unif
offspring2_unif <- rep(-1, length(parent1)) # initialize offspring2_unif
for(i in 1:length(parent1)) {
if (runif(1) < 0.5) {
offspring1_unif[i] <- parent1[i]
offspring2_unif[i] <- parent2[i]
} else {
offspring1_unif[i] <- parent2[i]
offspring2_unif[i] <- parent1[i]
}
}
# Shuffle crossover
## Shuffle
shuffler <- seq(1, length(parent1))
shuffler <- sample(shuffler, length(parent1))
## perform the crossover
crossover_point <- sample(1:length(parent1), 1)
offspring1_shuffle <- rep(-1, length(parent1)) # initialize offspring1_shuffle
offspring2_shuffle <- rep(-1, length(parent1)) # initialize offspring2_shuffle
for(i in 1:length(shuffler)) {
if (i < crossover_point) {
offspring1_shuffle[shuffler[i]] <- parent1[shuffler[i]]
offspring2_shuffle[shuffler[i]] <- parent2[shuffler[i]]
} else {
offspring1_shuffle[shuffler[i]] <- parent2[shuffler[i]]
offspring2_shuffle[shuffler[i]] <- parent1[shuffler[i]]
}
}
mean(offspring1_unif) # 0.493
mean(offspring1_shuffle) # 0.3295
mean(offspring2_unif) # 0.507
mean(offspring2_shuffle) # 0.6705
sd(offspring1_unif) # 0.499976
sd(offspring1_shuffle) # 0.4700552
sd(offspring2_unif) # 0.499976
sd(offspring2_shuffle) # 0.4700552
【问题讨论】:
标签: artificial-intelligence genetic-algorithm evolutionary-algorithm