Drools 如何将两个规划实体同步到一个值

Drools 如何将两个规划实体同步到一个值,drools,drools-planner,Drools,Drools Planner,我想在两个规划实体之间同步规划值。在这种情况下,我想让两个subjecteatherperiod选择彼此“重合”的时段,即使它们可能的值范围是不相交的 STP s1: period-N/A periodList->[1,2,3,4,5,6] STP s2: period-N/A periodList->[106,107,108,109,110,111] SyncConstraint(leftSTP = s1,rightSTP = s2) <A rule for SyncCons

我想在两个规划实体之间同步规划值。在这种情况下,我想让两个
subjecteatherperiod
选择彼此“重合”的时段,即使它们可能的值范围是不相交的

STP s1: period-N/A periodList->[1,2,3,4,5,6]
STP s2: period-N/A periodList->[106,107,108,109,110,111]
SyncConstraint(leftSTP = s1,rightSTP = s2)
<A rule for SyncConstraint that checks if s1.period and s2.period are compatible>
STP s1:period-N/A period list->[1,2,3,4,5,6]
STP s2:period-N/A periodList->[106107108109110111]
SyncConstraint(左STP=s1,右STP=s2)
例如,
Period
s
1
106
是兼容的,因为它们都是“周一的第一个小时”。同样适用于
2
107

我确实设置了规划实体难度,在
s1
之后分配
s2
(我看到了日志)。但它们是不兼容的赋值。在解算器操作结束时,系统永远不会从此类错误中恢复

如何使它们同步



在我提到的“兼容”和“一致”中,我指的是两个字段(星期几和日顺序)相等的
期间。每个类(以及该类中可能的句点的每个
SubjectTeacherPeriod
)都有单独的
Period
s.

在类
Period
上,创建一个getter
getPeriodType()
(例如返回“星期一的第一个小时”),然后添加这样的分数规则:

when
    MyEntity($leftType: period.periodType, $leftId : id, ...)
    MyEntity(period.periodType != $leftType, id < $leftId, ...)
when
    MyEntity($leftP : period, $leftId : id, ...)
    MyEntity($rightP : period, id != $leftId, ...)
    PeriodToPeriodTypeLink(period == $leftP, $t : type)
    not PeriodToPeriodTypeLink(period == $rightP, type == $t)