8.2. 解决方案环境模式
通过解决环境模式,您可以检测实施中的常见错误。它不会影响日志级别。
解决者只有一个随机实例。有些解析器配置使用随机实例。例如,Simulated Annealing 算法高度依赖于随机数字,而 Tabu Search
仅依赖于它来解析分数。环境模式会影响该随机实例的 seed。
您可以在 solver 配置 XML 文件中设置环境模式。以下示例设置 FAST_ASSERT
模式:
<solver xmlns="https://www.optaplanner.org/xsd/solver" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="https://www.optaplanner.org/xsd/solver https://www.optaplanner.org/xsd/solver/solver.xsd"> <environmentMode>FAST_ASSERT</environmentMode> ... </solver>
<solver xmlns="https://www.optaplanner.org/xsd/solver" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="https://www.optaplanner.org/xsd/solver https://www.optaplanner.org/xsd/solver/solver.xsd">
<environmentMode>FAST_ASSERT</environmentMode>
...
</solver>
以下列表描述了您可以在 solver 配置文件中使用的环境模式:
-
FULL_ASSERT
模式打开所有断言,例如,每次移动实施、约束、引擎本身等操作,每次移动实施错误出现增量分数计算不正确的断言。这个模式可以重复。它也是入侵的,因为它调用方法 computeScore ()
频率会比非 assert 模式更频繁。FULL_ASSERT
模式非常慢,因为它不依赖于增量分数计算。
-
NON_INTRUSIVE_FULL_ASSERT
模式打开几个断言,以便在移动实施、约束、引擎本身等错误上快速失败。这个模式可以重复。它不是非侵入性,因为它不会调用方法 computeScore ()
比非 assert 模式更频繁。NON_INTRUSIVE_FULL_ASSERT
模式非常慢,因为它不依赖于增量分数计算。
-
FAST_ASSERT
模式打开大多数断言,例如 undoMove 的分数与移动之前相同的断言,以便在移动实现、移动实施、约束、引擎本身等错误上快速失败。这个模式可以重复。它也是入侵的,因为它调用方法 computeScore ()
频率会比非 assert 模式更频繁。FAST_ASSERT
模式缓慢。编写一个测试案例,通过FAST_ASSERT
模式执行简短运行您的计划问题。
REPRODUCIBLE
模式是默认模式,因为它在开发过程中是推荐的模式。在这个模式中,两个以相同的 OptaPlanner 版本运行,以相同的顺序执行相同的代码。它们每一步都运行的结果都相同,但如果适用以下备注。这可让您一致地重现错误。它还使您能够对某些重构进行基准测试,如分数约束性能优化,在运行之间相当好。注意尽管使用
REPRODCIBLE
模式,但出于以下原因,您的应用程序可能仍然无法完全可重复生成:-
使用
HashSet
或另一个集合
,它在 JVM 运行之间对计划实体或规划值的集合有不一致的顺序,而不是普通问题事实,特别是在解决方案实现中。使用LinkedHashSet
替换它。 - 结合时间渐进的依赖算法,最重要的是 Simulated Annealing 算法以及花费时间终止。分配的 CPU 时间有非常大的差异会影响时间渐变的值。使用 Late Acceptance 算法替换 Simulated Annealing 算法,或使用步骤终止替换终止的时间。
-
使用
-
REPRODUCIBLE
模式可能比NON_REPRODUCIBLE
模式稍慢。如果您的生产环境可从可重复生成过程中获益,请在生产环境中使用此模式。在实践中,如果未指定 seed,则REPRODUCIBLE
模式使用默认的固定随机发现,同时还会禁用某些并发优化,如工作窃取。
-
NON_REPRODUCIBLE
模式可能比REPRODUCIBLE
模式稍快。避免在开发过程中使用它,因为它会导致调试和程序错误修复比较困难。如果您的生产环境中的可重复生成性并不重要,请在生产环境中使用NON_REPRODUCIBLE
模式。在实践中,如果没有指定 seed,这个模式不使用固定的随机发现。