遗传编程中的动态测试用例数量?

时间:2012-04-20 08:33:10

标签: genetic-programming

在查看遗传编程论文时,在我看来,测试用例的数量总是固定的。然而,大多数突变应该(?)在执行的每个阶段都是非常有害的,即。即在一个测试用例之后,突然显示变异程序比前一个程序执行得更糟。如果您一开始只尝试极少数(一个?)测试用例并查看突变是否有意义,会发生什么?

可能是因为不同的测试用例会测试解决方案的不同功能,而一个突变可能只会改善其中一个功能吗?

4 个答案:

答案 0 :(得分:0)

我不知道我是否同意你的假设,即大多数突变应该是非常有害的,但即使它们你也不应该关心。您的目标不是优化个体,而是优化人口。因此,试图确定“突变是否有意义”正是遗传编程应该做的事情:即消除“没有意义”的突变。您对算法的唯一“指导”应该来自适应度函数。

答案 1 :(得分:0)

我也不确定你对“测试用例”的意思,但对我而言,这听起来像是在寻找与多目标优化(MOO)相关的东西。这意味着您尝试针对问题的不同方面优化解决方案 - 因此您不需要针对特定​​测试用例改变/评估群体,而是需要找到多目标适应度函数。 “MOO的主要思想是帕累托主导的概念”(http://www.gp-field-guide.org.uk

答案 2 :(得分:0)

我认为这在理论上是一个好主意,但很难付诸实践。我不记得以前看过这种方法,但如果有的话,我也不会感到惊讶。

我认为你这样做的动机是为了提高应用健身功能的效率 - 你可以提前停止评估并丢弃个体(或者设置适应度为0)如果测试看起来会很糟糕

一个挑战是决定要应用多少个测试用例;在一个随机测试用例之后抛弃一个人肯定不是一个好主意,因为测试用例可能是一个真正的异常值。如果个人的适应度低于最佳值的10%,可能会在50%的测试用例后终止评估,这可能不会丢弃任何非常好的个体;另一方面,它可能不值得,因为很多人将具有中路适应性,并且可能只能节省一小部分计算。你可以调整数字,这样你就可以节省更多的精力,但是你试图节省的努力越多,你就会有更多机会被真正的好人丢弃。

考虑到编写此代码和可能的错误等所花费的额外时间,我不应该认为这样做是有价值的(除非这是一个研究项目,在这种情况下尝试并看看它可能会很有趣)。

答案 3 :(得分:0)

我认为这是一个好主意。健身评估是GP中计算量最大的过程,因此估计个体的适应度值以减少实际计算适应度的计算费用可能是一个重要的优化。

你的想法是一种适应性近似的形式,有时它被称为懒惰评价(尝试搜索这些词,有一些研究论文)。

还有不同但有些重叠的方案,例如:

  • 动态子集选择(Chris Gathercole,Peter Ross)是一种选择实际执行GP算法的训练数据集的一小部分的方法;
  • 基于细分的遗传编程(Nailah Al-Madi,Simone Ludwig)是一种通过将数据集划分为细分并在适应性评估过程中使用细分来缩短GP执行时间的技术。

PS也在育雏重组交叉(Tackett)儿童计划中通常在有限数量的测试案例中进行评估,以加快交叉。