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