1

TLDR:

我如何使用DEAP来进化Genotypes而不仅仅是Genes,例如(Gene1, Gene2, ...){'gene1':..., 'gene2':...}

一个最小的示例是创建 DEAP 的OneMax示例的进化,使用 的基因型(np.ndarray(10), np.ndarray(42)),其中Genotype[0]只有与Genotype[0]...[1]...[1]的配对和整个基因型可用于评估适应度。


在 Python 的DEAP中,常见的用例是拥有一个“基因”,例如一个可以配对、变异和评估适合度的列表。

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

具体来说,我有一个我想代表的“神经网络”

  1. 一种神经元参数基因

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

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

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, ...)
4

1 回答 1

1

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

1)使用 dict 作为单独的容器,使您的自定义 initDict 功能

2)编写您的自定义dict版本的交配和个人评估功能,对个人的不同键做不同的事情

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

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)
于 2018-06-06T14:26:43.340 回答