2

私は現在、OptaPlanner と Drools を使用して、コース スケジューリング用のアプリケーションを作成しています。Drools で記述されたルールの 1 つは、同じ日のエントリ (スケジュールの時間枠) を 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

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
于 2014-05-07T06:12:34.827 に答える