2

使用带有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库。

4

2 回答 2

1

当你设计你的遗传算法时,你需要将你的“基因”映射到一个或多个染色体上。您的问题似乎是“拥有多个染色体有什么影响?”

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

  1. 选择从哪个父母的染色体开始。
  2. 沿着染色体线性走,将位(或任何密码子)复制到正在构建的子染色体。
  3. 在每一位,翻转一个随机数,看看你是否应该“交叉”到另一个父染色体作为拷贝的来源。
  4. 在复制每个位时,翻转另一个随机数以查看该位是否应该“突变”。

因此,在一条染色体内,亲本遗传物质的混合量由交叉率决定。

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

如果你有两条染色体,那么孩子有 50% 的机会是父母之一的副本,有 50% 的机会是一半一半。

如果您有 10 条染色体,那么孩子有 512 分之一的机会是父母之一的副本。

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

如果每条染色体有一个“基因”,那么每一代都会随机混合亲本基因。这意味着您的遗传算法无法选择位于同一染色体中的良好基因组合。这通常应该避免,因为它消除了可以显着提高遗传算法性能的遗传混合的重要组成部分。

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

于 2017-04-19T15:09:50.467 回答
1

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

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

Genotype.of(DoubleChromosome.of(0.0, 1.0, 3));
于 2017-04-19T15:02:31.773 回答