Drools OptaPlanner上一个调度问题的结构/优化

Drools OptaPlanner上一个调度问题的结构/优化,drools,optaplanner,kie,Drools,Optaplanner,Kie,我想用OptaPlanner生成一个计划,有以下问题: “任务”是规划实体 它有固定的持续时间 它有一个员工(计划变量),必须与所需技能相匹配 它有一个工作站(计划变量),必须与所需的属性相匹配 它具有依赖性:某些任务必须在其他任务之后启动 有些任务有最后期限 首先,基于OptaPlanner任务分配示例,我尝试使用链式/阴影变量。在我的第一次尝试中,我将员工作为锚,并让工作站管理层对解算器执行以下操作: 我很快发现这种方法存在问题。在这里,任务A和任务B(以及所有其他任务)在不在同一

我想用OptaPlanner生成一个计划,有以下问题:

  • “任务”是规划实体
    • 它有固定的持续时间
    • 它有一个员工(计划变量),必须与所需技能相匹配
    • 它有一个工作站(计划变量),必须与所需的属性相匹配
    • 它具有依赖性:某些任务必须在其他任务之后启动
    • 有些任务有最后期限
首先,基于OptaPlanner任务分配示例,我尝试使用链式/阴影变量。在我的第一次尝试中,我将员工作为锚,并让工作站管理层对解算器执行以下操作:

我很快发现这种方法存在问题。在这里,任务A和任务B(以及所有其他任务)在不在同一个链上时对另一个有影响,而且链的前一个元素没有足够的信息来确定任务的开始时间。此外,最糟糕的是,在这个模型中,工作站的变化没有被跟踪,解决方案是没有意义的,因为工作站可以被多次使用

为了解决工作站跟踪问题,我将工作站添加到锚中,并进行了所有员工/工作站组合

通过这种方式,我了解每条链上的员工和工作站。但是,这并不能解决链上任务的开始时间依赖于其他链上的任务(例如,任务a和任务D共享同一工作站)的问题,因此任务插入/删除会对其他链产生影响,这不是精神

我最终放弃了链式变量的想法,因为它们的用法似乎不适合我的问题

所以我修改了我的类,任务的开始时间现在由OptaPlanner的解算器决定,由纯drools规则和ValueRangeProvider驱动

当我只有以下规则时:

  • 无员工恢复(硬)
  • 无工作站恢复(硬)
  • 技能和属性要求(硬)
  • 截止日期在截止日期之前结束的任务(软,可以是中等)
  • 尽快结束任务(结束时间平方和,软)
我可以很快找到一个似乎是最好的解决方案

但是,当我在任务之间添加依赖项时(通过一个硬规则来确定任务依赖项是否在任务开始后结束),复杂性似乎会急剧增加,因此对于几十个任务来说,只有2个操作员、3个工作站,这是一个令人满意的解决方案(任务之间没有意外的漏洞)可能需要一个小时,参数如下:

  • 实验长度:10000分钟
  • 粒度:1分钟
我还有一个任务难度比较程序,可以帮助解决者将最难的任务放在前面

这对于一些任务来说是非常长的,当插入用户可用性的概念时,情况会糟糕得多,我甚至怀疑它永远不会收敛,因为任务结束时间将根据可用性“跳跃”

因此,我的问题是:

  • 是否有适合我的问题的利用链式变量的解决方案
  • 他们是否对解算器/规则/其他方面进行了优化,从而可以给我带来宝贵的加速