如何编写仅在构造启发式阶段处于活动状态的约束



我希望有一些仅在构造启发式阶段有效的约束,所以我这样写:

fun aConstraintOnlyActiveInCHPhase(constraintFactory: ConstraintFactory): Constraint {
return constraintFactory.from(MyPlanningEntity::class.java)
.ifExists(MyPlanningEntity::class.java,
Joiners.filtering({entity1,entity2 -> entity2.myplanningvariable == null})
)
...
...
.penalize("aConstraintOnlyActiveInCHPhase",HardSoftScore.ONE_HARD)
}

然而,这适用于除最后一个规划实体外的所有规划实体,当最后一个计划实体初始化时,没有其他未初始化的规划实体,因此此约束将不会处于活动状态。

如何在构建启发式阶段编写对所有规划实体都有效的约束?

此外,如何编写在求解过程中处于不同阶段的约束?

简单的答案是你没有。分数表示解决方案的质量,因为它与特定问题有关。您正在解决的问题在每个解算器阶段都是相同的。

如果您更改了约束,则表示您正在更改优化问题,因此不妨使用新配置运行新的求解器。在那之前,你得到的任何解决方案都可能被抛出窗外,因为它是针对不再有效的不同标准进行优化的。

也就是说,如果您开始使用forEachIncludingNullVars(...),上面的约束将满足您的要求。这将包括未初始化的实体,帮助您避免ifExists(...)黑客攻击。

相关内容

最新更新