遗传编程¶
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个元素。
- class deap.gp.PrimitiveSet(name, arity, prefix='ARG')[源代码]¶
类与
PrimitiveSetTyped
相同,只是没有类型的定义。
- class deap.gp.Primitive(name, args, ret)[源代码]¶
封装了一个基本操作的类,当使用参数调用时,它返回调用该基本操作的Python代码。
>>> pr = Primitive("mul", (int, int), int) >>> pr.format(1, 2) 'mul(1, 2)'
- 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问题的基本类型的类。该集合还定义了研究函数返回类型以及输入参数的类型和数量。
- 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 – 定义表达式中终端的名称。
- 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 时,节点可能会无序绘制。