Drools规则CE收集过多次

时间:2014-05-06 21:38:23

标签: drools rule collect optaplanner

我目前正在使用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

1 个答案:

答案 0 :(得分:0)

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

我试着写下这样的规则:

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