OptaPlanner/TimeFold:FULL_ASSERT与NON_INTRUSIVE_FULL_ASSERT选型疑问
OptaPlanner/TimeFold:FULL_ASSERT vs NON_INTRUSIVE_FULL_ASSERT 对比
为什么要选用FULL_ASSERT?
- 核心目的是验证增量计分逻辑的正确性。如果你的项目自定义了
IncrementalScoreCalculator(增量计分器),FULL_ASSERT会在每次解的变动后,同时用增量计分和直接调用calculateScore()的完全计分两种方式计算分数,对比两者结果是否一致。这能快速发现增量计分中的bug——比如某些约束条件没被正确触发、分数计算遗漏了部分实体/关系,避免因为计分逻辑错误导致算法找到错误的最优解。 - 就算用的是框架默认的drools计分,FULL_ASSERT也能帮你验证规则编写的正确性,排查规则里的逻辑漏洞。
二者检查范围谁更全面?
FULL_ASSERT的检查范围比NON_INTRUSIVE_FULL_ASSERT更全面:
- NON_INTRUSIVE_FULL_ASSERT只做非侵入式的基础检查,比如验证解的结构完整性、约束的基本合法性,但不会调用
calculateScore(),也不会对比增量和完全计分的结果。 - FULL_ASSERT除了包含NON_INTRUSIVE的所有检查外,额外增加了增量计分与完全计分的一致性校验,这是它独有的核心功能,能覆盖到计分逻辑深层的错误,而这些错误是NON_INTRUSIVE无法检测到的。
二者性能谁更快?
NON_INTRUSIVE_FULL_ASSERT的性能远优于FULL_ASSERT:
- FULL_ASSERT每次解的变动都要额外执行一次
calculateScore()(完全计分),完全计分需要遍历所有实体和约束,计算成本很高,会导致整体运行速度大幅下降,通常只在调试阶段使用。 - NON_INTRUSIVE_FULL_ASSERT不需要调用
calculateScore(),仅做轻量的非侵入检查,性能损耗很小,接近生产模式(如FAST_ASSERT或无断言模式)的运行速度。
内容的提问来源于stack exchange,提问作者marinier
相关产品推荐
相关产品推荐

