传统上,要使用OptaPlanner进行扩展,您必须学习DRL。 不再。 借助受Java 8 Streams和SQL启发的新Constraints Streams API,您现在可以用Java (或Kotlin或Scala) 编写约束,并且仍然可以从增量计算中受益。
在下面,约束流(CS)仍使用强大的Drools引擎。 我们也仍然完全支持得分DRL。 它们不被弃用。
让我们从一个例子开始。 在护士排班中,为了避免将班次分配给员工Ann
,您可以在DRL中编写以下约束:
rule "Don't assign Ann"
when
Shift(getEmployee().getName() == "Ann" )
then
scoreHolder.addSoftConstraintMatch(kcontext, - 1 ); end
这在使用约束流的Java中是相同的约束:
Constraint constraint = constraintFactory
.from(Shift. class )
.filter(shift -> shift.getEmployee().getName().equals( "Ann" ))
.penalize( "Don't assign Ann" , HardSoftScore.ONE_SOFT);
如果您熟悉SQL或Java 8流,则应该看起来很熟悉。 给定一个有四个班次的潜在解决方案(其中两个分配给Ann
),这些班次将通过约束流流动,如下所示: