Optaplanner - Drools 规则 List<> memberOf List<>?

Optaplanner - Drools rules List<> memberOf List<>?

我正在享受 Optaplanner 的旅程。 Java 不是我的 "native" 语言,但令我惊讶的是,Optaplanner 和 Drools 的(陡峭?)学习曲线并没有让我放弃!

到目前为止我得到了什么: 我已经用必要的 classes 制作了一个项目。为了我的问题,我将简化为:Employee class、Job class、Skills class 和Schedule class,我想在这里获得完美的 Optaplanned 时间表。

我的员工 class 有一个变量 List<Skill> skills 包含至少一项他们拥有的技能。 我的工作 class 包含相同的变量 List<Skill> reqSkills (req = required)。这包含至少一项完成这项工作所需的技能。

我已经用一些虚拟数据进行了初始化。然后我运行下面的规则:

rule "requiredSkills"
    when
        Employee($skills : skills)
        Job(reqskills not memberOf $skills)
    then
        scoreHolder.addHardConstraintMatch(kcontext, -1);
end

我想(但这里 Drools 的陡峭曲线打败了我)这似乎是合乎逻辑的:当员工的技能不是工作所需技能的成员时,那就是一个硬约束。.

我的 "planning" 的结果始终是:我作为虚拟数据放入的第一个员工与所有工作相关联...

我的感觉是,使用 memberOf 不适用于列表 vs 列表。但是我该如何解决这个问题,因为我的员工和我的工作可能 have/require 多种技能?

我从不在 OptaPlanner 案例中使用 drools 构造 not memberOf。也许是因为习惯,也许是因为它慢或脆。

FWIW,这与 the skill requirement in optaweb-employee-rostering 非常相似,后者仅在 Shift DRL 模式中使用纯 java 代码构造:

rule "Required skill for a shift"
    when
        Shift(
                employee != null,
                !getEmployee().hasSkills(getSpot().getRequiredSkillSet()))
    then
        scoreHolder.addHardConstraintMatch(kcontext, -100);
end