这两种基因型的区别

Difference between theses two kind of Genotype

使用具有 N (任意 > 0 数字) 具有 1(一个)基因的染色体和具有 1(一)条染色体的基因型 N (相同数量) 基因?

在代码中:

// 3 chromosomes with 1 gene each
Genotype.of(
    DoubleChromosome.of(0,1),
    DoubleChromosome.of(0,1),
    DoubleChromosome.of(0,1)
)

对比

// 1 chromosome with 3 genes each
Genotype.of(
    DoubleChromosome.of(
       DoubleGene.of(0,1),
       DoubleGene.of(0,1),
       DoubleGene.of(0,1)
    )
)

我的问题不是关于在 eval 函数中获取值,而是它是否可以以某种方式(结果或进化)改变遗传算法。

更新

我正在使用 Jenetics 库。

这两种基因型的区别在于创建的双基因的允许范围。在版本一中,允许三个染色体的基因具有不同的范围(实际上它们没有)。在第二个版本中,基因型创建了一个长度为 3 的染色体,其中所有基因都被迫具有相同的数值范围(第一个基因的范围)。另一个区别是,交叉操作只对具有相同索引或数值范围的染色体进行。

如果您的双基因具有相同的数值范围,那么第二个版本通常是更好的选择。您可以以更有意识的方式创建此版本:

Genotype.of(DoubleChromosome.of(0.0, 1.0, 3));

在设计遗传算法时,您需要将 "genes" 映射到一条或多条染色体上。您的问题似乎是 "What is the effect of having multiple chromosomes?"

在繁殖阶段,一个新的 (child) 基因组是从两个现有的 (parent) 基因组创建的。一般来说,对于每条染色体,您执行以下操作:

  1. 选择 parent 的染色体开始。
  2. 沿着染色体线性移动,将位(或任何密码子)复制到正在构建的 child 染色体。
  3. 在每一位,翻转一个随机数,看看是否应该 "crossover" 到另一个 parent 染色体作为副本的来源。
  4. 随着每个位被复制,翻转另一个随机数以查看该位是否应该"mutated."

因此,在一条染色体内,parental 遗传 material 的混合量由交叉率决定。

如果交叉率非常低(或为零)并且只有一条染色体,那么每个 child 很可能是一个 parent 或另一个的副本。这通常应该避免,因为它消除了遗传混合的一个重要组成部分,可以显着提高遗传算法的性能。

如果你有两条染色体,那么 child 有 50% 的几率是 parent 之一的副本,有 50% 的几率是 half-and-half .

如果你有十条染色体,那么 child 是其中一条 parent 的副本的概率为 512 分之一。

换句话说,在应用有性繁殖时,至少有几个染色体会导致良好的遗传混合(无论使用的交叉率如何)。

如果你每条染色体有一个 "gene",那么你最终会在每一代中随机混合 parent 个基因。这意味着您的遗传算法无法 select 获得位于同一染色体上的基因的良好组合。这通常应该避免,因为它消除了遗传混合的一个重要组成部分,可以显着提高遗传算法的性能。

我的建议是遵循自然规律,使用 5-50 范围内的染色体数量。您可能想尝试改变染色体的数量,看看它如何影响您的应用程序的性能。