Optaplanner-动态约束级别



我最近开始了从Drools到Constraint Streams的迁移,到目前为止我很喜欢它,但我在惩罚配置((和约束配置方面遇到了问题。一些约束的级别和权重可以从UI中更改,我以前用Drools:这样做

rule "someConstraint"
when
$constraint : Constraint()
...
then
if ($constraint.level() == ConstraintLevel.HARD) {
scoreHolder.addHardConstraintMatch(kcontext, - $constraint.weight());
} else if ($constraint.level() == ConstraintLevel.MEDIUM) {
scoreHolder.addMediumConstraintMatch(kcontext, - $constraint.weight());
} else {
scoreHolder.addSoftConstraintMatch(kcontext, - $constraint.weight());
}
end

然而,我不知道如何使用惩罚配置((和约束配置(关于级别(来实现这一点。在我的情况下,可以使用两次或两次以上相同类型的约束,但使用不同的级别和权重,我能想到的唯一解决方案是复制约束实现并按级别进行筛选,但这样做感觉很脏。有什么建议吗?感谢

正确的方法(如"按设计"中的"正确"(是使用约束配置并在那里定义约束权重。

配置实例存储在规划解决方案中。因此,对于不同的解决方案,可以存储具有不同约束权重的约束配置的不同实例。这允许您动态地对约束进行评分,甚至可以通过将某些约束的权重设置为零来禁用这些约束。

在求解器配置级别,可以通过为不同的问题选择不同的约束提供的实现来补充,使可能性真正无限。

最新更新