这两种基因型的区别
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) 基因组创建的。一般来说,对于每条染色体,您执行以下操作:
- 选择 parent 的染色体开始。
- 沿着染色体线性移动,将位(或任何密码子)复制到正在构建的 child 染色体。
- 在每一位,翻转一个随机数,看看是否应该 "crossover" 到另一个 parent 染色体作为副本的来源。
- 随着每个位被复制,翻转另一个随机数以查看该位是否应该"mutated."
因此,在一条染色体内,parental 遗传 material 的混合量由交叉率决定。
如果交叉率非常低(或为零)并且只有一条染色体,那么每个 child 很可能是一个 parent 或另一个的副本。这通常应该避免,因为它消除了遗传混合的一个重要组成部分,可以显着提高遗传算法的性能。
如果你有两条染色体,那么 child 有 50% 的几率是 parent 之一的副本,有 50% 的几率是 half-and-half .
如果你有十条染色体,那么 child 是其中一条 parent 的副本的概率为 512 分之一。
换句话说,在应用有性繁殖时,至少有几个染色体会导致良好的遗传混合(无论使用的交叉率如何)。
如果你每条染色体有一个 "gene",那么你最终会在每一代中随机混合 parent 个基因。这意味着您的遗传算法无法 select 获得位于同一染色体上的基因的良好组合。这通常应该避免,因为它消除了遗传混合的一个重要组成部分,可以显着提高遗传算法的性能。
我的建议是遵循自然规律,使用 5-50 范围内的染色体数量。您可能想尝试改变染色体的数量,看看它如何影响您的应用程序的性能。
使用具有 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) 基因组创建的。一般来说,对于每条染色体,您执行以下操作:
- 选择 parent 的染色体开始。
- 沿着染色体线性移动,将位(或任何密码子)复制到正在构建的 child 染色体。
- 在每一位,翻转一个随机数,看看是否应该 "crossover" 到另一个 parent 染色体作为副本的来源。
- 随着每个位被复制,翻转另一个随机数以查看该位是否应该"mutated."
因此,在一条染色体内,parental 遗传 material 的混合量由交叉率决定。
如果交叉率非常低(或为零)并且只有一条染色体,那么每个 child 很可能是一个 parent 或另一个的副本。这通常应该避免,因为它消除了遗传混合的一个重要组成部分,可以显着提高遗传算法的性能。
如果你有两条染色体,那么 child 有 50% 的几率是 parent 之一的副本,有 50% 的几率是 half-and-half .
如果你有十条染色体,那么 child 是其中一条 parent 的副本的概率为 512 分之一。
换句话说,在应用有性繁殖时,至少有几个染色体会导致良好的遗传混合(无论使用的交叉率如何)。
如果你每条染色体有一个 "gene",那么你最终会在每一代中随机混合 parent 个基因。这意味着您的遗传算法无法 select 获得位于同一染色体上的基因的良好组合。这通常应该避免,因为它消除了遗传混合的一个重要组成部分,可以显着提高遗传算法的性能。
我的建议是遵循自然规律,使用 5-50 范围内的染色体数量。您可能想尝试改变染色体的数量,看看它如何影响您的应用程序的性能。