动态 planningVariable with rangeProvider

Dynamic planningVariable with rangeProvider

我尽量让我的问题的域尽可能简单:

我有 jobSteps 的工作。该作业需要一个开始时间,并且 jobSteps 具有不同的机器、处理时间和允许的过度处理时间。但是每个作业的最大过度处理时间是不同的,甚至是 0(不允许)。

现在应该根据某些条件安排作业: 一旦一项工作开始,它就必须没有任何停顿地完成(每个步骤都必须完成) 应尽快开始工作。

所以我有两个计划变量:作业的开始时间和作业步骤的 usedOverprocessTime (过度处理某些工作可能是有意义的 - 因为下一台机器仍在短时间内处理其他工作)

简单示例: 作业 1:{[机器:A,processTime:80,allowedOverprocessTime:20],[机器:B,processTime:80,allowedOverprocessTime:0],[机器:C,processTime:100,allowedOverprocessTime:30]}

作业 2:{[机器:A,processTime:50,allowedOverprocessTime:10],[机器:B,processTime:80,allowedOverprocessTime:30],[机器:C,processTime:100,allowedOverprocessTime:30] }

作业开始时间的代码有点简单:

@PlanningEntity
@Entity
public class Job {
   ...
   @PlanningVariable(valueRangeProviderRefs = "jobStartTimeRange")
   private Integer jobStartTime;

然后我有一个计划解决方案class:

@PlanningSolution
public class JobSchedule {
    ...
    @ValueRangeProvider(id = "jobStartTimeRange")
    public List<Integer> createStartTimeList() {
        // here i calculate a worst case range if the jobs have to 
        // be worked on one after the other without overlapping
    }

到目前为止这应该有效。现在是过度处理时间的问题:

@PlanningEntity
public class JobStep {
    ...
    @PlanningVariable(valueRangeProviderRefs = "plannedOverprocessTimeRange")
    public Integer plannedOverprocessTime = 0;

对于提供商,我需要当前步骤 return 从 0 到特定最大值的单个范围。我什至想到 returning Map 这样每个步骤都可以查找特定范围。但是注解只针对集合。

那么是否有可能像我需要的那样为计划变量动态创建范围?老实说,如果我是第一个提出这个要求的人,我会感到很惊讶。

OptaPlanner 支持范围广泛的 ValueRangeProvider 实现,它还允许您实现自己的实现。这个问题没有说明您是否已经尝试过这种机制但它不适用于您的用例,或者您是否根本不知道此功能。

我的解释是,如果你在你的规划实体上放一个ValueRangeProvider,你就可以做你需要的。