如何在功能上测试遗传算法

时间:2012-12-24 09:59:21

标签: functional-testing genetic-algorithm non-deterministic

我在Java中创建了一个遗传算法,它是一个可以添加到多个应用程序中的库的形式。在开发过程中,我做了一些(jUnit)测试,这些测试可能是功能测试,但它们没有断言,因为算法是不确定的。因此,它们不适合自动测试,当运行一段时间后,您必须花时间看看该解决方案的内容。

解决方案是车辆路线,可以打印成XLS格式,并且在必要时进行实际测试,因此您知道在那一刻要寻找什么。 它们有一个距离值和一个时间值,每个例子都有一个合理的值,路径本身也不能有某些锯齿形,尽管有时必须有锯齿形。

我可以断言价值在合理的范围内,但这些并不清楚,我不确定我是不会留下不好的解决方案。如果知道人们在做什么,或者您对此事有什么看法,那将会很棒。

编辑:澄清目标:

  • 单元测试已经解决了。我可以从不同函数的逻辑代码中隔离随机数生成代码,并测试逻辑函数,从测试代码中传递非随机数。
  • 我想进行一些功能测试,无论是Cucumber还是Selenium测试,没有假数据。实际输入,生成实际输出。 (我不是说我想特别使用Cucumber或Selenium,只是说我要求的不是单元测试,算法的行为必须是真实的,不得以任何方式伪造)

该库用于不同的项目,每个项目的输入数据遵循相同的模型,但它有不同的偏见。一个项目数据可以有很多重复的同一点,而另一个项目则没有。人们可以非常快地达到极限容量的车辆,而在其他车辆中,这个极限几乎无法达到。

目标是从插入的每个项目中获取样本数据,以便在修改算法时快速反馈算法的行为(如修改或添加变异或交叉运算符,或添加新的参数化)。因此,它的行为绝不能以任何方式伪造。

鉴于这一切,我要问的问题是找到一种方法来有效地断言整个行为。我想问一下其他人是如何解决这个问题的,或者你们有什么可以说的。

2 个答案:

答案 0 :(得分:1)

单元测试用于测试代码中单元的行为。即使整体算法是非确定性的,这些也是完全可测试的。你想要实现的目标(我相信)是一种自动化集成测试的方法。为此,您需要设置一个结果是确定性的场景(当然可以,例如,我的实现可以解决2个字节之和的最大值),或者您需要伪造您的算法为确定性(通过修复输入,输出和随机生成的值。)

根据您的修改:

我的GA实现从未包含现实测试,只包含单元和集成测试。第一个证明了实现的理论正确性,而第二个证明了实现的凝聚力。这两个因素都告诉我一些关于代码质量的信息,而不是性能(性能是从最佳输出产生的输出)。

如果我说得对,你想测量你的实现的性能,看看修改的效果。为此,您首先需要样本输入数据和最佳输出数据。我想你有第一个。第二个可能更棘手。其次,您需要为每个测试集运行多次。由于GA是不可预测的(基于您配置的突变率)。这一切都可能达到一个简单的样本测试集会更有效的程度。

无论如何,至于回答你的问题:在多次运行之后,你的断言应该验证平均误差(与最佳输出相比)是否在可接受的范围内。

答案 1 :(得分:1)

在一般情况下,您的伪随机数生成器会被攻击者难以准确预测 - 通常基于计算机的时钟或正常运行时间。但是,如果使用常量为伪随机数生成器播种 - 它将始终返回相同的结果。所以你可以用种子pRNG进行单元测试。这将提供一个体面的 - 不完美,但体面 - 防止回归。