使用Optaplanner进行基于优先级的项目作业调度

时间:2014-10-31 07:08:44

标签: optaplanner

我希望通过为每个项目添加优先级来增强Optaplanner的项目作业调度示例。假设每个项目都有自己的优先级(1:高,2:中,3:低),优先级较高的项目将首先执行,如果项目具有相同的优先级,它将根据它的顺序执行(先到先得)先服务)。 如果我们采用这个例子: enter image description here 假设项目Book1具有中等优先级而Book2项目具有高优先级,这意味着项目Book2应该在项目Book1之前首先执行,当然结果将与上图不同。 我需要建议如何实现这个额外的要求。我已经想到的一个解决方案是在将所有项目数据列表分配给Optaplanner解决它之前对其进行排序,但该解决方案似乎有点奇怪。 任何建议和意见将不胜感激。谢谢&问候。

2 个答案:

答案 0 :(得分:2)

经过一些试验 - 错误和拔毛活动后,我终于成功地用优先基础​​项目功能增强了示例。所以我想,我会在这里分享,因为也许在未来的时间里,这可能会帮助那些对我有同样需求的人。 首先,我们需要在Project类中添加一个简单的属性(我正在使用int):

private int priority;

请记住为此属性创建getter和setter方法。之后创建一个比较器类并为其命名AllocationDifficultyComparator,将其设置为实现Comparator,Serializable。将这些代码放在比较方法中:

return new CompareToBuilder().append(a.getProject.getPriority(), b.getProject().getPriority()).append(b.getId(), a.getId()).toComparison();

打开Allocation类,然后在@PlanningEntity注释中添加一个difficultyComparatorClass变量,将值设置为AllocationDifficultyComparator.class。 最后一步,打开projectJobSchedulingSolverConfig.xml文件,将constructionHeuristicType更改为FIRST_FIT_DECREASING,我们完成了,好! :-D

要测试它,我们可以为sampleData xml文件添加优先级属性,例如我们可以使用值:

  

高= 3 |中= 2 |低= 1

注意:如果2个项目具有相同的优先级,它将根据较小的id执行(这意味着项目优先于另一个项目)。

这就是它,我希望这份可以帮助将来某人完成他们的工作并阻止他们拉扯他们的头发:-D

答案 1 :(得分:0)

根据Optaplanner文档,我们不应该使用comfortComparatorClass来实现业务逻辑。 上述方法违反了该原则。 也许应该限制使用时间?