遗传编程

The gp 模块提供了使用 DEAP 进行遗传编程的方法和类。它主要包含构建遗传程序树的类,以及评估这些树的函数。

此模块支持强类型和弱类型的GP。

class deap.gp.PrimitiveTree(content)[源代码]

专门为遗传编程操作优化的树结构。树以列表形式表示,其中节点按深度优先顺序追加,或在用原始列表和终端列表(例如通过 gp.generate 方法生成)初始化此类对象时假设已追加。追加到树中的节点需要具有 arity 属性,该属性定义了原始的元数。终端节点预期具有0的元数。

classmethod from_string(string, pset)[源代码]

尝试将一个字符串表达式转换为给定 PrimitiveSet pset 的 PrimitiveTree。该原语集需要包含表达式中的每个原语。

参数:
  • string – Python 表达式的字符串表示。

  • pset – 从中选择原语的原语集。

返回:

填充了反序列化原语的 PrimitiveTree。

property height

返回树的高度,或最深节点的深度。

property root

树的根,列表的第0个元素。

searchSubtree(begin)[源代码]

返回一个切片对象,该对象对应于以索引 begin 的元素为根的子树所定义的值范围。

class deap.gp.PrimitiveSet(name, arity, prefix='ARG')[源代码]

类与 PrimitiveSetTyped 相同,只是没有类型的定义。

addEphemeralConstant(name, ephemeral)[源代码]

向集合中添加一个临时常量。

addPrimitive(primitive, arity, name=None)[源代码]

将具有元数 arity 的原始 primitive 添加到集合中。如果提供了名称 name,它将替换属性 __name__ 以表示/标识该原始。

addTerminal(terminal, name=None)[源代码]

向集合中添加一个终端。

class deap.gp.Primitive(name, args, ret)[源代码]

封装了一个基本操作的类,当使用参数调用时,它返回调用该基本操作的Python代码。

>>> pr = Primitive("mul", (int, int), int)
>>> pr.format(1, 2)
'mul(1, 2)'
class deap.gp.Terminal(terminal, symbolic, ret)[源代码]

封装表达式中终端原语的类。终端可以是值或 0 元函数。

deap.gp.compile(expr, pset)[源代码]

编译表达式 expr

参数:
  • expr – 要编译的表达式。它可以是 PrimitiveTree、Python 代码字符串或任何转换为字符串时生成有效 Python 代码表达式的对象。

  • pset – 表达式编译所针对的原语集。

返回:

如果原始集合有1个或更多参数,则返回一个函数,或者返回通过评估树产生的结果。

deap.gp.compileADF(expr, psets)[源代码]

编译由树列表表示的表达式。列表的第一个元素是主树,随后的元素是自动定义的函数(ADF),可以由第一个树调用。

参数:
  • expr – 要编译的表达式。它可以是 PrimitiveTree、Python 代码字符串或任何转换为字符串时生成有效 Python 代码表达式的对象。

  • psets – 原始集列表。每个集合对应一个ADF,而最后一个集合与表达式相关联,并应包含对前面ADF的引用。

返回:

如果主原语集有1个或更多参数,则返回一个函数,否则返回通过评估树产生的结果。

class deap.gp.PrimitiveSetTyped(name, in_types, ret_type, prefix='ARG')[源代码]

包含可用于解决强类型GP问题的基本类型的类。该集合还定义了研究函数返回类型以及输入参数的类型和数量。

addADF(adfset)[源代码]

将一个自动定义函数(ADF)添加到集合中。

参数:

adfset – PrimitiveSetTyped 包含用于构建 ADF 的基元。

addEphemeralConstant(name, ephemeral, ret_type)[源代码]

向集合中添加一个临时常量。临时常量是一个不带参数的函数,返回一个随机值。该常量的值对于一棵树来说是恒定的,但在不同的树之间可能不同。

参数:
  • name – 用于指代这种短暂类型的名称。

  • ephemeral – 无参数返回随机值的函数。

  • ret_type – 由 ephemeral 返回的对象的类型。

addPrimitive(primitive, in_types, ret_type, name=None)[源代码]

向集合中添加一个原始元素。

参数:
  • primitive – 可调用对象或函数。

  • in_types – 基本参数类型列表

  • ret_type – 原始类型返回的类型。

  • name – 原始类型的替代名称,而不是其 __name__ 属性。

addTerminal(terminal, ret_type, name=None)[源代码]

向集合中添加一个终端。终端可以使用可选的 name 参数命名。这应该用于:定义命名常量(例如:pi);当对象构建时间长时加速评估时间;当对象没有返回构建对象代码的 __repr__ 函数时;当对象类不是 Python 内置类时。

参数:
  • terminal – 对象,或一个没有参数的函数。

  • ret_type – 终端的类型。

  • name – 定义表达式中终端的名称。

renameArguments(**kargs)[源代码]

使用 kargs 中的新名称重命名函数参数。

property terminalRatio

返回终端数量与所有类型原语数量的比率。

deap.gp.graph(expr)[源代码]

构建一个树表达式的图。树表达式必须是有效的。它按顺序返回一个节点列表、一个边列表和一个每个节点的标签字典。节点由数字表示,边是连接两个节点(数字)的元组,标签是字典的值,其中键是节点编号。

参数:

expr – 一个转换为图形的树表达式。

返回:

节点列表、边列表和一个标签字典。

返回的对象可以直接用于填充 pygraphviz 图:

import pygraphviz as pgv

# [...] Execution of code that produce a tree expression

nodes, edges, labels = graph(expr)

g = pgv.AGraph()
g.add_nodes_from(nodes)
g.add_edges_from(edges)
g.layout(prog="dot")

for i in nodes:
    n = g.get_node(i)
    n.attr["label"] = labels[i]

g.draw("tree.pdf")

或一个 NetworX 图:

import matplotlib.pyplot as plt
import networkx as nx

# [...] Execution of code that produce a tree expression

nodes, edges, labels = graph(expr)

g = nx.Graph()
g.add_nodes_from(nodes)
g.add_edges_from(edges)
pos = nx.graphviz_layout(g, prog="dot")

nx.draw_networkx_nodes(g, pos)
nx.draw_networkx_edges(g, pos)
nx.draw_networkx_labels(g, pos, labels)
plt.show()

备注

我们鼓励您使用 pygraphviz ,因为当使用 NetworX 时,节点可能会无序绘制。