在查看遗传编程论文时,在我看来,测试用例的数量总是固定的。然而,大多数突变应该(?)在执行的每个阶段都是非常有害的,即在一个测试用例之后很明显,突变的程序比前一个执行得更差。如果您一开始只尝试很少(一个?)测试用例并查看突变是否有意义,会发生什么?
是否可能是不同的测试用例测试解决方案的不同特性,而一个突变可能只会改进其中一个特性?
在查看遗传编程论文时,在我看来,测试用例的数量总是固定的。然而,大多数突变应该(?)在执行的每个阶段都是非常有害的,即在一个测试用例之后很明显,突变的程序比前一个执行得更差。如果您一开始只尝试很少(一个?)测试用例并查看突变是否有意义,会发生什么?
是否可能是不同的测试用例测试解决方案的不同特性,而一个突变可能只会改进其中一个特性?
我认为这是个好主意。适应度评估是 GP 中计算量最大的过程,因此估计个体的适应度值以减少实际计算适应度的计算开销可能是一个重要的优化。
您的想法是适应度近似的一种形式,有时称为惰性评估(尝试搜索这些词,有一些研究论文)。
还有一些不同但有些重叠的方案,例如:
PS 也在 Brood Recombination Crossover (Tackett) 子程序中通常对有限数量的测试用例进行评估以加速交叉。
我也不确定“测试用例”是什么意思,但对我来说,听起来你正在寻找与多目标优化(MOO)相关的东西。这意味着您尝试针对问题的不同方面优化解决方案 - 因此您不需要为特定的测试用例改变/评估总体,而是要找到一个多目标适应度函数。“MOO 的主要思想是帕累托优势的概念”(http://www.gp-field-guide.org.uk)
我不知道我是否同意你的假设,即大多数突变应该是非常有害的,但即使它们是,你也不应该在意。您的目标不是优化个体,而是优化总体。因此,试图确定“突变是否有意义”正是基因编程应该做的事情:即消除“没有意义”的突变。您对算法的唯一“指导”应该来自适应度函数。
我认为这在理论上是一个好主意,但很难付诸实践。我不记得以前实际使用过这种方法,但如果有,我不会感到惊讶。
我认为您这样做的动机是提高应用适应度函数的效率 - 如果测试看起来很糟糕,您可以提前停止评估并丢弃个体(或将适应度设置为 0)。
一个挑战是决定应用多少个测试用例;在一个随机测试用例之后丢弃一个人肯定不是一个好主意,因为测试用例可能是一个真正的异常值。如果个体的适应度小于最佳值的 10%,则在 50% 的测试用例之后终止评估可能不会丢弃任何非常好的个体;另一方面,考虑到很多人都处于中等水平并且很可能只节省一小部分计算,这可能不值得。您可以调整这些数字,以便节省更多精力,但是您尝试节省的精力越多,真正优秀的人被意外丢弃的机会就越大。
考虑到额外的时间来编写这个和可能的错误等,我不应该认为这样的好处是值得的(除非这是一个研究项目,在这种情况下,尝试它可能会很有趣)。