TLDR:
我如何使用DEAP来进化Genotypes而不仅仅是Genes,例如(Gene1, Gene2, ...)
或{'gene1':..., 'gene2':...}
一个最小的示例是创建 DEAP 的OneMax示例的进化,使用 的基因型(np.ndarray(10), np.ndarray(42))
,其中Genotype[0]
只有与Genotype[0]
、...[1]
与...[1]
的配对和整个基因型可用于评估适应度。
在 Python 的DEAP中,常见的用例是拥有一个“基因”,例如一个可以配对、变异和评估适合度的列表。
我的一般问题是,我想使用基因的异构列表/元组/字典,每个都有自己的类型,而诸如交配之类的功能仅按类型定义。
具体来说,我有一个我想代表的“神经网络”
一种神经元参数基因
和一个网络结构+参数的基因。
类型(借用类型语言的语法)可能是
NeuronGene :: np.ndarray(n)
NetworkGene :: np.ndarray((n, n))
这些数组是结构化的 numpy 数组,具有各种键,例如:np.dtype([('a', int), ('b', float), ...])
,因此在 中的每个索引处NeuronGene
,我都有一个带有键的字典式参数{'a':..., 'b':..., ...}
。如果这使问题过于复杂,我仍然很想看看如何拥有 genericnp.ndarray
的基因型。
“基因型”可能是Individual :: (NeuronGene, NetworkGene)
, 和
一个适当的mate
函数可能被定义为:
mate :: NeuronGene -> NeuronGene -> NeuronGene
mate :: NetworkGene -> NetworkGene -> NetworkGene
作为一个最小的例子,我试图复制 DEAP 的OneMax问题,但使用 2 个基因的基因型。所以 2 个不同大小np.ndarray
的 s,每个都试图单独最大化它们的总和。即使通读DEAP 的文档和代码库,我的代码也不值得发布。
对于像这个最小示例这样的简单问题,当然可以使用一个长度为 的基因n + m
,但在我的实际情况中,我有一个为 的基因(1D array, 2D array)
,而突变/交配对于该基因型中的每个单独基因来说意味着不同的东西。
我应该提一下,我的eval
函数只是解析为一个单一的适应度函数,尽管我认为一个适当的通用答案可以针对多个进行优化。
eval :: Genotype -> Float
# or
eval :: Genotype -> (Float, Float, ...)