【发布时间】:2018-08-17 09:59:07
【问题描述】:
TLDR:
我如何使用DEAP 来进化基因型 而不仅仅是基因,例如(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))
这些数组是structured numpy arrays,带有各种键,例如:np.dtype([('a', int), ('b', float), ...]),所以在NeuronGene 中的每个索引处,我都有一个带有键{'a':..., 'b':..., ...} 的类字典参数。如果这使问题过于复杂,我仍然很想看看如何拥有通用np.ndarrays 的基因型。
“基因型”可能类似于Individual :: (NeuronGene, NetworkGene),并且
适当的mate 函数可能定义如下:
mate :: NeuronGene -> NeuronGene -> NeuronGene
mate :: NetworkGene -> NetworkGene -> NetworkGene
作为一个最小的例子,我尝试复制 DEAP 的 OneMax 问题,但使用 2 个基因的基因型。所以 2 个不同大小的np.ndarrays,每个都试图单独最大化它们的总和。即使阅读 DEAP's docs 和 codebase,我的代码也不值得发布。
对于像这个最小示例这样的简单问题,当然可以使用长度为 n + m 的一个基因,但在我的实际情况中,我有一个基因是 (1D array, 2D array),并且突变/交配对每个单独的基因意味着不同的东西在那个基因型中。
我应该提到我的eval 函数只是解析为一个单一的适应度函数,尽管我认为一个适当的一般答案可以优化多个。
eval :: Genotype -> Float
# or
eval :: Genotype -> (Float, Float, ...)
【问题讨论】:
标签: python numpy genetic-algorithm evolutionary-algorithm deap