我很享受通过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
不适用于列表和列表。但是,由于我的两个员工都可能拥有/需要多种技能,我该如何解决这个问题?
答案 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