在各种常见的规划场景中,我们经常会遇到一种不完全规划的情况。即在正常情况下,在完成了一次规划运算(甚至是CH阶段的运算中),OptaPlanner的规划实体(Planning Entity, 下称规划实体)中每个规划变量(Planning Variable,下称规划变量)必须非空,即必须被赋予规划变量取值范围(ValueRange,规划变量取值范围)范围内的值;尽管有更约束被违反,也必须实现赋值。

​  例如,在CloudBalance示例中,若一个数据集中存在足够多的进程(CloudProcess对象),以致启用所有计算机的内存无法装入所有进程。此时,引擎还是会强行把一些进程塞进一些已经内存已经不足的计算机中,从而出现内存这个约束(硬约束)被打破。但在我们的实际场景中,面对这种情况,我们并不希望输出这种违反硬约束的结果;因为在这样的业务情景中,违反硬约束的结果已经是典型的不可行方案了。我们更希望引擎能更机智灵活地识别出这种实际场景中毫无意义的方案,从而找到一个不会将资源过度分配的方案。

  这种方案在OptaPlanner中被称为 Overconstrained Planning,对于这种资源超用的处理情况,可归结为对资源的过度分配。以下用户手册的章节描述了两种方法实现方法:https://www.optaplanner.org/docs/optaplanner/latest/repeated-planning/repeated-planning.html#overconstrainedPlanning

​  从文中可以看到,要实现这种功能,OptaPlanner并没有开箱即用的方法或功能。但通过其中的一些特性我们仍然可以通过简单的方法巧妙实现。目前主要有两种办法来实现“避免资源超用”情况,分别是 - "让规划变量允许为空"和"为规划变量的取值范围提供到一些虚拟值".

让规划变量允许为空

  ​正常来说,对于一个规划问题来说,一个可能的方案(Possible Solution)是其所有规划实体(Planning Entity, 下称规划实体)的所有规划变量)都完成赋值。在规划的CH阶段就是实现对每一个规划变量进行赋值的阶段。通过在定义规划变量中加入nullable属性并将其属性值设置为true来让一个规划变量在规则过程中允许保留空值。如下代码:

@PlanningVariable(nullable = true)
public getCloudComputer{
         return cloudComputer;
}
12-16 03:39