当前位置: 首页 > 知识库问答 >
问题:

在规则中使用CountableValueRange

沈飞跃
2023-03-14

我目前正在为共享一些资源的任务构建一个调度应用程序。每个任务可能使用一定百分比的资源。

我需要在Drools规则中检查的是每个共享资源不被并行任务使用超过100%。

因此代码看起来如下所示:

@Data
public class Resource {
   @PlanningId
   private Integer id;

   private String label;
}
public class ResourceUsage {
   @PlanningId
   private Integer id;

   private Resource resource;

   private int usagePercent;

}

要计划的实体

@Data
@PlanningEntity
public class TaskAssignment {
   @PlanningId
   private Integer id;

   @PlanningVariable(valueRangeProviderRefs = { "slotRange" })
   private Integer timeSlot;

   private int duration;
   private ResourceUsage resourceUsage;

   public Integer getEndingSlot() {
        return timeSlot + duration;
   }
}

最后是解决方案

@Data
@PlanningSolution
public class PlanningSolution {
  @PlanningId
  private Integer id;

  @PlanningEntityCollectionProperty
  private List<TaskAssignment> tasks = new ArrayList<>();

  @ValueRangeProvider(id = "slotRange")
  public CountableValueRange<Integer> getSlotRange() {
        return ValueRangeFactory.createIntValueRange(0, 10_000);
  }

  @ProblemFactCollectionProperty
  private Set<Resource> resources = new TreeSet<>();
}

有没有办法或者我必须切换回我的时隙课程?

编辑:包含在一种阴影规划实体中的阴影变量能起到这个作用吗?

共有1个答案

慕鹏
2023-03-14

我终于找到了一种方法来编写一个规则,它允许我避免在时隙中迭代。其思想是在赋值的开头计算使用情况

rule "Maximum usage of a resource"
       when
             $r : Resource()
             $p : TaskAssignment($id1 : id, $ts : timeSlot != null,
                                 resourceUsage!.ressource==$r,
                                 $usage : resourceUsage!.usagePercent);
             accumulate(TaskAssignment(timeSlot != null, timeSlot <= $ts, 
                                      endingSlot > $ts, id != $id1, 
                                      resourceUsage!.ressource==$r, 
                                      $rate : resourceUsage!.usagePercent);
                                  $s:sum($rate);
                                  $s + $usage > 100) 
       then
             scoreHolder.addHardConstraintMatch(kcontext, 100-($s + $usage));         
end
 类似资料:
  • 我想禁用Sonar的规则,这样它就不会在网页中显示结果。在我的例子中,我想隐藏(或不捕获)关于尾随注释的结果。 是否可以在某处配置它? 谢谢。

  • 问题内容: 如何在CSS中使用多于规则的内容? 我已将其插入样式表中: 当前,这仅适用于网站上的整个文本。但是,我想指定使用其他字体。我怎样才能做到这一点? 问题答案: 其中包括您在下面看到的CSS的更具描述性的细分(并说明了使它在IE6-9上更好地工作的调整)。

  • 我在试着处理drools中的列表。我正在传递一个请求,其中包含一个购买列表。我想做几个规则,包括检查大小是否正确,然后如果所有元素都相同,如果所有购买都经过授权。。。我有以下代码,但在使用列表时遇到了问题。这是正确的方法吗?尤其是在检查尺寸时?

  • 在JUnit 4.10及更低版本中,可以将规则注释为@规则和@ClassRur。这意味着规则会在类之前/之后以及每次测试之前/之后被调用。这样做的一个可能原因是设置一个昂贵的外部资源(通过@ClassRur调用),然后廉价地重置它(通过@Rur调用)。 从JUnit 4.11开始,@规则字段必须是非静态的,@ClassRule字段必须是静态的,因此上述操作不再可行。 有明确的变通方法(例如,明确地

  • 我正在使用drools引擎构建一个预警系统。当条件满足时,我们需要在规则(RHS)的操作上执行由Spring Framework实例化的@Service方法。 让Spring框架创建的@service实例被Drools规则的操作(RHS)使用的方法是什么? 我遵循了以下指示: 使用表单导入功能(Rule1.drl)。此解决方案不起作用,因为该类是在drools中实例化的,需要执行静态方法 关于如何

  • 选择器使用规则 1. 可以使用 * 通用选择器。 * 通用选择器效率低是一个误区,如有必要可以使用。测试文章关于css通配符性能问题不完全测试 例如: * { -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; } 2. 不要在选择器末尾使用 * 通用选择器。 CSS