我正在做一个利用TinyGP的项目。我正在研究 TinyGP 代码,但它真的很“密集”,几乎没有评论。我可以让它根据我的样本数据演化方程。它们通常是蔓延的方程,它们确实会接近我用来生成数据的源方程。
我不知道的是 TinyGP 实际上在哪里创建新的随机常数,以及在 GP 中完成此操作的技术是什么?
我正在做一个利用TinyGP的项目。我正在研究 TinyGP 代码,但它真的很“密集”,几乎没有评论。我可以让它根据我的样本数据演化方程。它们通常是蔓延的方程,它们确实会接近我用来生成数据的源方程。
我不知道的是 TinyGP 实际上在哪里创建新的随机常数,以及在 GP 中完成此操作的技术是什么?
你应该看看Genetic Programming Field Guide
. 它解释了其中的一部分。不同的 GP 使用不同的技术来生成常量。在 TinyGP 中,它们是“终端集”的一部分。TinyGP 一开始就生成它们。所以它们是固定的。通过变异和交叉创建新的“常量”。
也许 1、2 和 10 在你的常数集中。您可能有一个常数 1 作为终端节点。突变可能使这个“1/2”,现在你有 0.5。进一步的突变可能会将其更改为“1/2/10”。现在你有 0.05。每一步都保留完整的树。这就是 TinyGP 有效获取更多常量值的方式。
这确实会导致您注意到的庞大方程。重写规则可以帮助解决这个问题。不过,您需要考虑何时重写。最后重写可以给你更好看的方程。随手重写会为您提供更小的树,这可能会阻止 TinyGP 创建更丰富的常量集,因为现在需要变异和交叉的分支更少。
一个非常简单的重写规则是压缩所有常量值。例如,如果您没有检测到某个节点下的变量,则只需计算它并替换为计算值。对于 TinyGP,您只能在最后执行此操作,因为您无法随时引入新的常量节点。