遗传编程中的指数

时间:2012-04-17 00:05:55

标签: genetic-programming exponent

我希望终端变量具有实值指数(不仅仅是整数)。 例如,假设我想演化一个函数y = x ^ 3.5 + x ^ 2.2 + 6.我该怎么办?我还没有看到任何GP实现可以做到这一点。 我尝试使用power函数,但有时初始解决方案有很多指数,评估值超过'double'界限! 任何建议将不胜感激。提前谢谢。

4 个答案:

答案 0 :(得分:0)

整数具有与实数不同的二进制表示,因此您必须使用稍微不同的位串表示和重组/变异运算符。

有关优秀演示,请参阅www.cs.vu.nl/~gusz/ecbook/slides/Genetic_Algorithms.ppt的第24页,或查看Eiben / Smith的书“进化计算遗传算法简介”。这描述了如何将位串映射到实数。然后,您可以创建一个表示,其中x仅位于区间[y,z]内。在这种情况下,选择y和z的幅度小于您正在使用的数据类型的容量(例如,双倍的10 ^ 308),因此您不会遇到您描述的溢出问题。

答案 1 :(得分:0)

你必须考虑使用实值指数和负数基数,你不会得到真实的,但是复数。例如,.NET中的Math.Pow实现表示如果您尝试计算负基数对非整数指数的幂,则会得到NaN。您必须确保所有x值都是正值。我认为这是你在“超出双重界限”时所看到的问题。

顺便说一下,您可以尝试HeuristicLab GP实施。它具有可配置的语法,非常灵活。

答案 2 :(得分:0)

如果只有初始人口中的一些患有溢出问题,那么只需要用较差的健康评分来惩罚他们,他们可能会在几代内被从人群中移除。

但是,如果问题是几乎所有人都遇到这个问题,那么你将不得不添加一些约束。最简单的做法是将幂函数的指数子句约束为实数 - 这意味着不允许嵌套幂。这取决于这是否足以满足您的需求。有几种方法可以添加这些约束(或更复杂的约束) - 尝试查看Constrained Syntactic Structures和语法引导GP。

其他一些简单的想法:您可以使用范围更大的数据类型吗?此外,您可以减少最大深度参数,以便嵌套指数的空间更小。当然,这只在某种程度上是可能的,而且取决于函数的复杂性。

答案 3 :(得分:0)

DEAP(在Python中)实现它。实际上有一个example。通过在原始集中添加Python中的math.pow,您可以实现您想要的效果。

pset.addPrimitive(math.pow, 2)

但是使用pow运算符可能会产生类似x ^(x ^(x ^(x)))的风险,这可能是不可取的。你应该在树的哪个地方添加一个限制(通过我不确定的方式)允许战俘(就在叶子之类的东西之前)。

OpenBeagle(在C ++中)也允许它,但你需要使用<math.h>中的pow来开发自己的原语,你可以使用Sin或Cos原语作为例子。