python - 在Python的DEAP中,我怎样才能拥有一个具有多个基因的个体,例如 "Genotype"?

标签 python numpy genetic-algorithm evolutionary-algorithm deap

TLDR:

如何使用DEAP进化基因型而不仅仅是基因,例如(Gene1, Gene2, ...){'gene1':。 .., 'gene2':...}

一个最小的例子是创建 DEAP 的 OneMax 的演变例如,使用 (np.ndarray(10), np.ndarray(42)) 的 Genotype,其中 Genotype[0] 仅与 Genotype[0 配合]...[1]...[1],整个 Genotype 可用于评估适应度。

<小时/>

在 Python 中 DEAP ,常见的用例是拥有一个“基因”,例如单个列表,可以对其进行交配、突变和评估适应性。

我的一般问题是,我想使用基因的异构列表/元组/字典,每个基因都有自己的类型,并且交配等功能仅由类型定义。

具体来说,我有一个“神经网络”,我想用它来表示

  1. 神经元参数的一个基因

  2. 以及一个网络结构+参数的基因。

类型(借用类型化语言的语法)可能是

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.ndarray,每个 np.ndarray 都试图分别最大化它们的总和。甚至通读DEAP's docscodebase ,我的代码不值得发布。

对于像这个最小示例这样的简单问题,当然您可以使用一个长度为 n + m 的基因,但在我的实际情况中,我有一个基因 (1D array, 2D array),而突变/交配对于该基因型中的每个个体基因来说意味着不同的东西。

我应该提到,我的 eval 函数只是解析为一个健身函数,尽管我认为正确的通用答案可以针对多个进行优化。

eval :: Genotype -> Float
# or
eval :: Genotype -> (Float, Float, ...)

最佳答案

我不确定我完全理解您的需要,但这可能会有所帮助:

1) 使用 dict 作为单独的容器,创建自定义的 initDict 函数

2)编写您的自定义字典版本的交配和个人评估函数,这些函数对个人的不同键执行不同的操作

下面是创建类似字典的随机数组个体并对其进行评估的示例。然后,您可以修改用于交配、突变等的 DEAP 基本算法,以便它们可以按照您想要的方式处理字典。

from deap import base
from deap import creator
from deap import tools
import numpy as np

def initDict(container, func, dim):
    return container(zip(dim.keys(), map(lambda val: func(val), dim.values())))

def evalIndividual(individual):
    return [individual[key].sum() for key in individual.keys()]

toolbox = base.Toolbox()
creator.create("FitnessMax", base.Fitness, weights=(1.0,1.0))  # fitness
creator.create("Individual", dict, fitness=creator.FitnessMax)

#function for generation arrays of random values and random size in each dimension (min 2, max 10) but fixed number of dimensions by the dim argument
toolbox.register("attr_random", lambda dim: np.random.rand(*np.random.randint(2,10,dim)))
toolbox.register("individual", initDict, creator.Individual, toolbox.attr_random, dim = dict(neuron = 2, network = 3))
ind = toolbox.individual()
ind.fitness.values = evalIndividual(ind)
print(ind.fitness)

关于python - 在Python的DEAP中,我怎样才能拥有一个具有多个基因的个体,例如 "Genotype"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49183439/

相关文章:

python - 最佳实践 : update/extend subclass class attribute

c# - C# 中的遗传编程

python - 在 python 中输入 Callable 到特定方法

python - 从文本文件填充字典

python - 更改python中函数的默认参数

python - 如何连接 pandas.DataFrames 列

python-2.7 - 使用 numpy 计算文本文档之间的 Kullback-Leibler (KL) 距离

java - 解决卡片问题的神经网络

c++ - 我的数组是导致 CPU 和内存快速增加的原因吗?

python - pickle 转储 Pandas DataFrame