2

我目前正在使用 OptaPlanner 和 Drools 编写课程安排应用程序。我们用 Drools 编写的规则之一将同一天的条目(时间表的时间段)收集到 ArrayList 中。

在测试我们的规则时,我注意到这条规则被触发了多次,即通过收集它们找到的条目的确切数量。我认为这条规则触发这么多次的原因是由于重新组合找到的条目(又名回溯),即。当同一天有 10 个条目时,此规则触发 10 次

有什么办法可以取消这种行为?

如果它可能有助于推理我的问题,这是我正在谈论的规则:

rule spareHoursViolated
        when
            $traject : Traject()
            Date($day := day, $month := month, $year := year) 
            $lecturesOnSameDay: ArrayList() from collect 
                        (Entry($day := startingDate.day, 
                                $month := startingDate.month,
                                $year := startingDate.year, courseComponent.course 
                                         memberOf $traject.courses))
        then
            sort($lecturesOnSameDay);
            scoreHolder.addSoftConstraintMatch(kcontext,
            checkSpareHoursAndNoonBreak($lecturesOnSameDay));
end
4

1 回答 1

0

通过checkSpareHoursAndNoonBreak()在 RHS 端实施,它不会尽可能多地进行基于增量的分数计算。(请参阅有关基于增量/增量的分数计算的文档部分)。

我会尝试编写如下规则:

when 
   $t : Traject()
   $l1 : Lecture(traject == $t, $d : day, $p1 : period)
   // Another lecture on the same day, but after the original one
   $l3 : Lecture(traject == $t, day == $d, period > $p1, $p3: period)
   // No lecture in between
   not Lecture(traject == $t, day == $d, period > $p1, period < $p3)
   // It's not lunch
   eval(!Utils.isLunch($l1, $l3)) // Even better is to move this into the $l3 Lecture part
then
   // It's a spring hour
   scoreHolder.addSoftConstraintMatch(kcontext,
            // Punish more spring hours more
            - ($p3.index - $1.index));
end
于 2014-05-07T06:12:34.827 回答