如何在Python中使用DEAP将GP转换为字符串并再次返回?

时间:2016-11-25 04:21:58

标签: python genetic-algorithm evolutionary-algorithm genetic-programming deap

我在遗传编程中做了一个项目,我需要能够将遗传程序(类deap.creator.Individual)转换为字符串,改变一些事情(同时保持问题100%语法上与DEAP),然后将其重新放回个体群体中以进一步进化。

但是,我只能使用from_string方法将我的字符串转换回类gp.PrimitiveTree。 创造者的唯一构造者。我个人看到盲目地生成整个群体或从现有的个体构建个体。没有方法只能从现有 gp.PrimitiveTree创建一个人。

那么,有没有人知道我该怎么做?

注意:个人是自定义的,但它是所有DEAP示例的标准,并使用

创建
creator.create("FitnessMax", base.Fitness, weights=(1.0,))
creator.create("Individual", gp.PrimitiveTree, fitness=creator.FitnessMax)

2 个答案:

答案 0 :(得分:1)

经过许多个小时,我相信我已经明白了这一点。

因此,我在两个DEAP模块之间感到困惑:'创建者'和'工具箱'。 为了让我创建一个具有给定PrimitiveTree的个体,我只需要这样做:

creator.Individual(myPrimativeTree)

做的是:

toolbox.individual(myPrimativeTree)

因为它通常被设置为初始化者本身,因此不会参与。

我希望这可以在将来某个时候为某人节省相当多的时间。

答案 1 :(得分:0)

单个字符串: str(单个)

为了从字符串创建个人:原始树具有类方法from_string: https://deap.readthedocs.io/en/master/api/gp.html#deap.gp.PrimitiveTree.from_string

在您的Deap演变中,要从字符串创建个人,您可以尝试类似的操作(请注意使用Creator和Toolbox):

creator.Individual.from_string("add(IN1, IN2)", pset)

但是单个表达式作为一个字符串,必须与您做str(individual)时一样,在创建字符串时也要坚持使用pset。因此,在我上面的示例字符串中,我相信您将需要具有类似于以下内容的pset:

pset = gp.PrimitiveSetTyped("MAIN", [float]*2, float, "IN")
pset.addPrimitive(operator.add, [float,float], float)