偶校验问题¶
奇偶校验是经典的GP问题之一。目标是找到一个程序,该程序能够根据n个独立的布尔输入生成布尔偶校验值。通常使用6个布尔输入(Parity-6),目标是匹配每个可能的 \(2^6 = 64\) 条目中的正确奇偶校验位值。通过增加输入的数量可以使问题变得更难(在DEAP的实现中,这个数量可以通过调整名为PARITY_FANIN_M的常量来轻松调整)。
关于此问题的更多信息,请参见 参考。
使用的基本集合¶
Parity 使用标准的布尔运算符作为基本操作,这些操作符在 Python 的 operator 模块中可用。
pset = gp.PrimitiveSet("MAIN", PARITY_FANIN_M, "IN")
pset.addPrimitive(operator.and_, 2)
pset.addPrimitive(operator.or_, 2)
pset.addPrimitive(operator.xor, 2)
pset.addPrimitive(operator.not_, 1)
pset.addTerminal(1)
pset.addTerminal(0)
除了 n 个输入外,我们还添加了两个常数终端,一个在 0,一个在 1。
备注
由于 Python 是一种动态类型语言,您可以在没有任何问题的情况下混合使用布尔运算符和整数。
评估函数¶
在这个实现中,一个 Parity 个体的适应度仅仅是成功案例的数量。因此,适应度被最大化,并且在 6 输入问题的情况下,最大值为 64。
def evalParity(individual):
func = toolbox.compile(expr=individual)
return sum(func(*in_) == out for in_, out in zip(inputs, outputs)),
inputs 和 outputs 是两个预先生成的列表,用于加速评估,将给定的输入向量映射到正确的输出位。Python 的 sum() 函数可以处理布尔值(false 被解释为 0,true 被解释为 1),因此评估函数简化为计算成功测试的数量:这个和越大,个体越好。
结论¶
程序的其他部分大部分与 符号回归算法 相同。
完整的 examples/gp/parity。
参考¶
John R. Koza, “遗传编程II:可重用程序的自动发现”, MIT Press, 1994, 第157-199页.