0

タスクスケジューリングの問題に取り組んでいます。いつでも、プロセス全体が利用可能なリソースをそれ以上使用しないようにするルールを実装したいと思います。これを行うには、合計時間プロセスの各秒をループして、次のように各秒で使用されるリソースの合計を計算することを考えました。

accumulate(Task($sec <=endTime, $sec>= startTime, $res : resources);
                $sum : sum($res);
                $sum> Global.getInstance().getAvailableResources())

「$sec」はチェックする秒を表します。

drools を使用して毎秒ループするにはどうすればよいですか?

これに相当するものはありますか:

for ($sec= 0; $sec<$totalTime; $sec++)  {...}
4

1 に答える 1

1

毎秒個別にチェックすると、スコアの計算が大幅に遅くなる可能性があります。

より適切に機能する可能性のある代替案: 少なくとも 1 つのタスクが開始または終了するときに、1 秒ごとに論理的にマークを挿入するルールを作成します。

when
   Task($startTime : startTime, $endTime : endTime)
then
   insertLogical(new Mark($startTime));
   insertLogical(new Mark($endTime));
// Important: 2 Mark instances with the same time
//            are equals() true (and therefore have the same hashCode()).

次に、2マークごとに累積するだけの問題です

when
   Mark($startTime: time)
   Mark(time > $startTime, $endTime : time)
   not Mark(time > $startTime, time < $endTime)
   $total : ... accumulate( ... over every Task between $startTime and $endTime ...)
then
   scoreHolder.addHardConstraintMatch(($available - $total) * ($endTime - $startTime));
于 2014-06-03T07:15:19.640 に答える