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

时间:2018-12-10 21:31:27

标签: java drools optaplanner

我很享受通过Optaplanner的旅程。 Java不是我的“母语”语言,但令我惊讶的是Optaplanner&Drools的(陡峭的)学习曲线并没有驱使我放弃!

到目前为止,我得到的是: 我已经完成了一个具有必要类的项目。为了我的问题,我将简化为:Employee类,Job类,Skills类和Schedule类以获得我理想的Optaplan时间表。

我的员工班级有一个变量List<Skill> skills,其中至少包含他们所掌握的1种技能。 我的工作类别包含相同的变量List<Skill> reqSkills(要求=必填)。这至少包含1项能够完成此工作所需的技能。

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

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

我认为(但是Drools的陡峭曲线正在击败我)这似乎是合乎逻辑的:当员工的技能不是工作所需的技能的成员时,那就是硬约束。

“计划”的结果始终是:我作为虚拟数据投入的第一位员工已链接到所有作业...

我的感觉是使用memberOf不适用于列表和列表。但是,由于我的两个员工都可能拥有/需要多种技能,我该如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

在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