我试图用Optaplanner代替我自己来安排我们的工作计划。该系统具有一个包含必要信息和关系的MySQL数据库。对于这个问题,我只使用我需要的三个表:
Employees --> Have Skills
Jobs --> Have Skills
Skills
在口水里我有规矩
rule 'required Skills'
when
Job(employee != null, missingSkillCount > 0, $missingSkillCount : missingSkillCount)
then
scoreHolder.addHardConstraintMatch(kcontext, -10 * $missingSkillCount);
end
在Class Job
中,我有一个函数missingSkillCount()
public int getMissingSkillCount() {
if (this.employee == null) {
return 0;
}
int count = 0;
for (Skill skill : this.reqskills) {
if(!this.employee.getSkills().contains(skill)) {
count++;
}
}
return count;
}
当我运行我的程序时,Optaplanner说我的员工没有任何技能.
但是,当我手动使用这个函数(适合接受一个Employee作为参数):public int getMissingSkillCount(Employee employee)
时,会执行返回正确的值。
我很困惑!我知道contains
正在检查同一个对象,而不是对象的内容。但我不知道如何高效地做这件事..。
发布于 2019-12-03 15:54:36
( 1)你的工作是否在流口水工作记忆中?我假设它们是您的@PlanningEntity
,并且实例在您的@PlanningSolution
上的@PlanningEntityCollectionProperty
中,所以它们将是。您可以通过只匹配Job()
上的规则和执行System.out.println
来验证这一点。
2)尝试将约束编写为ConstraintStream (参见docs),并在getMissingSkillCount() > 0
lambda中放置一个调试断点,以查看发生了什么。
3)暂时打开FULL_ASSERT以验证是否存在记分错误。
4)打开调试,然后跟踪optaplanner的日志记录,查看里面发生了什么。
发布于 2019-12-16 12:25:19
仍然想知道让Optaplanner运行getMissingSkillCount()
和“手动”使用它之间有什么区别。
我通过重写equals()修复了它,这应该是我的第一条线索!
https://stackoverflow.com/questions/59165717
复制相似问题