两种基因型之间的差异

时间:2017-04-19 14:30:39

标签: java genetic-algorithm genetic-programming genetics genetic

使用基因型与 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库。

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:1)

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

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

  1. 选择哪个父母的染色体开始。
  2. 沿着染色体线性走,将位(或任何密码子)复制到正在构建的子染色体上。
  3. 在每一位,翻转一个随机数,看看你是否应该"交叉"另一个父染色体作为拷贝的来源。
  4. 复制每个位时,翻转另一个随机数,看看该位是否应该变异。"
  5. 因此,在染色体内,亲本遗传物质的混合量取决于交叉率。

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

    如果你有两条染色体,那么这个孩子有50%的可能是父母一方的副本,50%的几率是半数。

    如果您有10条染色体,那么该儿童中有一条可能是父母一方的副本。

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

    如果你有一个"基因"每个染色体,然后你最终随机混合每一代的父基因。这意味着您的遗传算法无法选择位于同一染色体中的基因的良好组合。这通常应该避免,因为它消除了遗传混合的一个重要组成部分,可以显着提高遗传算法的性能。

    我的建议是遵循大自然的领导,并使用5-50范围内的许多染色体。您可能希望尝试改变染色体的数量,并了解它如何影响应用程序的性能。