没有ProblemFactChange的重复计划

时间:2015-04-02 09:54:44

标签: optaplanner

我有点想知道如何实施重复计划。

该文件分为3种情况。 '备份计划','持续计划'和'实时计划'。

http://docs.jboss.org/optaplanner/release/latest/optaplanner-docs/html_single/index.html#repeatedPlanning

如果我没有遗漏某些内容,所有optaplanner示例(例如护士烘焙)都会使用' ProblemFactChange'来实施重复计划。这是在“实时计划”中描述的。没关系。 Solver.addProblemFactChange()将优雅地处理ProblemFactChange。

但这听起来像是一种实时规划的方法。我们应该如何实施备份计划' /'持续规划'以更简单的方式?

实现" 15.2中的内容。备份计划",

  

然后,当出现问题时(其中一名员工生病),   改变原始解决方案的计划事实(删除病人   员工未分配他/她的班次,然后重启   计划,从该解决方案开始,具有不同的分数   现在。建设启发式将填补新创建的空白   (可能与备用员工一起),甚至是元启发式   进一步改善它。

我只是:

  • 终止解算器
  • 从Solver获取BestSolution
  • 直接在BestSolution中编辑问题事实/计划实体(不要关心ScoreDirector)
  • 使用编辑过的BestSolution
  • 再次运行解算​​器

https://github.com/tkobayas/optaplanner/blob/repeatedPlanning/optaplanner-examples/src/main/java/org/optaplanner/examples/cloudbalancing/app/CloudBalancingHelloWorldRepeat.java#L52-L73

这是一种有效的方法吗?

1 个答案:

答案 0 :(得分:2)

关于上面的伪代码:这种方法也可以,它是一种手动形式的实时规划。 ProblemFactChange的优点是它是从另一个线程(异步)提交的。一旦这样的PFC进入,求解器线程就会注意到PFC队列不为空,停止求解,处理PFC队列然后再次开始求解。与上面描述的几乎相同。通过启用日志记录,我在CloudBalancing中看到,在异步线程提交PFC之前和解算器线程处理完之后的时间之间,再次找到初始化的可行解决方案的时间是12ms左右(取决于PFC当然,在我的情况下,它正在删除一台分配了10个进程的计算机。)

关于一般的重复计划:重复计划只是一个分类名称。 3种形式的重复计划(备份计划,持续计划,实时计划)相互补充(=彼此正交),它们不是彼此的替代品。

示例nurse rostering(员工排班)实现:

  • 实时计划:使用红色X按钮删除护士
  • 持续计划:按下“提前1天”按钮,结果计划窗口向右移动。

所有3种表格都有不同的需求,可以同时应用于同一个用例。