gpt4 book ai didi

optaplanner - optaplanner 域设计中多对多关系的最佳方法

转载 作者:行者123 更新时间:2023-12-03 01:55:10 25 4
gpt4 key购买 nike

您好,我想问在为我试图解决的问题设计领域时应采取什么方法,正如我在示例中看到的,设计往往类似于实体关系模型,例如多对多通过在两个实体之间放置关联实体来解决关系。我的问题是为什么会这样,这对性能有帮助吗?我应该遵循这种设计模式吗?

最佳答案

多对多关系,双方都是问题属性(例如,如果两个类都是问题事实)

关联实体的使用是可选的:这是您的设计调用。 OptaPlanner 不关心,但 Drools 关心,因此它会影响您的分数 DRL 的性能。

例如,假设 EmployeeSkill 之间存在多对多关系。一名员工拥有多种技能,而一项技能则由多名员工获得。我编写了大部分示例,并且更喜欢使用关联实体 - 因此我在这里使用 SkillAttained 类(尽管新示例 taskassigning 将避免将这些关联实体作为演示并提高测试覆盖率)。

至于性能影响,关键在于哈希和组合的计数方式。以及这如何影响增量分数计算(请参阅有关最后一个概念的文档)。 无论如何,请避免 DRL 中不必要的累积收集,因为它们尚未完全增量工作,因此会降低增益增量分数计算。

使用SkillAttained通常更容易获得良好的性能并设计规则。

when
ShiftAssignment($s : shift, $e : employee) // The when side must always contain a planning entity
SkillRequired(shift == $s, $s : skill) // Small perf opportunity: ShiftAssigment.getEmployee().getRequiredSkills() would avoid a lookup
not SkillAttained(employee == $e, skill == $s) // Good: the skill matching uses hashing for scalability if there are many skills
then
...addHard(-1); // Fires once per 1 missing skill

如果没有它,在不使用累积或收集的情况下通常会更难编写。但是,像 Employee.hasSkill(Skill) 这样的方法(假设员工的技能位于 LinkedHashSet 中)非常高效。

when
ShiftAssignment($c : countMissingSkills())
then
...addHard(- $c); // Fires once per ShiftAssignment with at least 1 missing skill

因此,在此示例中,ShiftAssignment.countMissingSkills() 必须非常高效(例如使用 LinkedHashSet/Maps 等)。

@PlanningVariabe 的多对多关系

目前OptaPlanner 6.4尚不支持规划变量的多对多关系。 Vote for this jira.因此,目前需要一个关联实体来解决这个问题。

关于optaplanner - optaplanner 域设计中多对多关系的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35948214/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com