【问题标题】:How should I unit test a heuristic algorithm?我应该如何对启发式算法进行单元测试?
【发布时间】:2023-03-05 16:51:01
【问题描述】:

所以我已经编写了蚁群优化 (ACO) 元启发式的实现,并且我想编写一些单元测试。但是,我不确定测试返回“正确”答案的能力因各种设置而异的方法的最佳方法。

一个单元如何测试启发式算法?

顺便说一句,代码位于https://github.com/rhgrant10/pants

【问题讨论】:

  • 它仍然是一个确定性算法,对吧?然后给定某些输入,它应该产生相同的输出。在给定可预测输入的情况下测试某些结果。
  • 我想我无法摆脱我正在测试默认设置而不是实际的 solve 方法的感觉。
  • 什么是正确答案?我对算法不熟悉。
  • 嗯,它目前正在解决旅行商问题。我实际上刚刚编写了一些实际上很好地满足我的目的的测试数据。我最终使用了一个圆圈中均匀分布的点。我可以简单地计算周长。该算法运行良好,可以在前 5 次迭代中以合理(和默认)设置找到它,所以我认为这在很大程度上解决了我的问题。
  • @BrianKelly 尽管 ACO(和其他元启发式算法)可以重复实现,但它不是确定性的。由于可重复性,相同代码的 2 次运行会给出相同的结果。由于不确定性,随着算法的改进,结果会有所不同(平均而言会有所改进,但不一定适用于每个数据集)。

标签: python unit-testing heuristics traveling-salesman


【解决方案1】:

我使用this integration test class 测试我的 TSP 实现,它进行了 2 次测试:

  • 断言它在 600 秒内达到某个分数。我在我的机器上在 10 秒内得到了这个分数,所以长时间的超时只适用于非常慢的詹金斯奴隶。如果它在那个时间限制内没有达到那个分数,它可能永远不会达到它。这个测试的重点是没有抛出异常(=冒烟测试),并且至少它在合理的时间内提高了分数。所以总比没有测试好:)
  • 将求解器置于断言模式 (FAST_ASSERT) 并断言它在 600 秒内达到某个更容易的分数。在 assertionMode 中,Solver 在其最深的循环中启用完整性检查(以性能为代价)。这是为了清除增量分数计算(= 增量分数计算)等中的错误。

最重要的是,我有单元测试来测试我的算法的特定组件,以检查它们是否按预期运行,例如this unit test class

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-06
    • 2013-07-16
    • 2016-09-18
    • 2011-01-01
    • 2017-04-30
    • 1970-01-01
    相关资源
    最近更新 更多