我正在处理任务调度问题。 我想实现一个规则,以确保在任何时候,整个过程不会使用更多可用的资源。 为此,我考虑循环整个时间过程的每一秒,并计算每秒使用的资源总和,如下所示:
accumulate(Task($sec <=endTime, $sec>= startTime, $res : resources);
$sum : sum($res);
$sum> Global.getInstance().getAvailableResources())
“$ sec”表示要检查的秒数。
我如何使用drools循环每秒?
是否有相应的内容:
for ($sec= 0; $sec<$totalTime; $sec++) {...}
答案 0 :(得分:1)
单独检查每一秒可能会大大减慢你的得分计算。
可能更好的替代方案: 我写了一条规则,当至少一个任务开始或结束时,每秒逻辑插入一个Mark。
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));