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