8.2. solver 环境模式
解决方案环境模式允许您检测实施中的常见错误。它不会影响日志级别。
寻址程序只有一个随机实例。有些解决方法配置使用随机实例,其随机实例数量不止于其他实例。例如,Simulated Anneing 算法依赖于随机数字,而 Tabu Search 仅依赖于它解析分数绑定。环境模式会影响该随机实例的影响。
您可以在解决器配置 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>
以下列表描述了您可以在解析器配置文件中使用的环境模式:
-
FULL_ASSERT模式会开启所有断言,例如,在每次移动中递增分数计算未损坏,导致移动实施、约束、引擎本身等问题的快速失败。这个模式是可重复生成的。它还容易受到入侵,因为它调用了方法computeScore()比非assert 模式更频繁。FULL_ASSERT模式非常慢,因为它不依赖于增量分数计算。
-
NON_INTRUSIVE_FULL_ASSERT模式开启一些断言,在移动实施、约束、引擎本身等方面快速失败。这个模式是可重复生成的。它是非侵入性,因为它不调用计算Score()比一个非断模式更频繁。NON_INTRUSIVE_FULL_ASSERT模式非常慢,因为它不依赖于增量分数计算。
-
FAST_ASSERT模式开启大多数断言,例如,撤消Move 的分数与移动前的分数相同,以在 Move 实施、移动实施、约束、引擎本身等时快速出现失败。这个模式是可重复生成的。它还容易受到入侵,因为它调用了方法computeScore()比非assert 模式更频繁。FAST_ASSERT模式很慢。编写与FAST_ASSERT模式的简短运行情况的测试案例。
REPRODUCIBLE模式是默认模式,因为建议在开发过程中。在这个模式中,两个以相同的 OptaPlanner 版本运行,会以相同的顺序执行相同的代码。这两个运行在每个步骤都具有相同的结果,但适用下列注释时除外。这可让您持续复制错误。它还可让您对某些重构进行基准测试,如分数约束性能优化,并在运行时非常公平。注意尽管使用
REPRODCIBLE模式,但出于以下原因,您的应用程序可能仍不能完全重复:-
使用
HashSet或另一个集合,JVM 运行之间有不一致的顺序,用于计划实体或规划值的集合,但并非正常问题事实,特别是在解决方案实现中。使用LinkedHashSet替换它。 - 将有时间的依赖算法合并起来,特别是模拟算法,以及所花费的时间和终止时间。分配的 CPU 时间有足够大的差异会影响时间值。将 Simulated Anneing 算法替换为 Late Acceptance 算法,或者用步骤数终止替换终止所花费的时间。
-
使用
-
REPRODUCIBLE模式可能比NON_REPRODUCIBLE模式稍慢。如果您的生产环境可从可重复生成的可复制性中受益,则在生产环境中使用此模式。在实践中,如果未指定任何 seed,则REPRODUCIBLE模式使用默认固定随机 seed,同时还会禁用某些并发优化,比如加速工作。
-
NON_REPRODUCIBLE模式可能比REPRODUCIBLE模式更快。避免在开发过程中使用它,因为它进行了调试和修复困难。如果在生产环境中复制性不重要,请在生产中使用NON_REPRODUCIBLE模式。在实践中,如果没有指定任何 seed,这个模式不使用固定的随机 seed。