publicclassTimeTableService{privateSolverManager<TimeTable,Long>solverManager;// Returns immediately, call it for every dataset
publicvoidsolveBatch(LongtimeTableId){solverManager.solve(timeTableId,// Called once, when solving starts
this.findById,// Called once, when solving ends
this.save);}publicTimeTablefindById(LongtimeTableId){...}publicvoidsave(TimeTabletimeTable){...}}
CloudBalanceproblem1=...;UUIDproblemId=UUID.randomUUID();// Returns immediately
SolverJob<CloudBalance,UUID>solverJob=solverManager.solve(problemId,problem1);...CloudBalancesolution1;try{// Returns only after solving terminates
solution1=solverJob.getFinalBestSolution();}catch(InterruptedException|ExecutionExceptione){throw...;}
3. 采用实时计划对环境条件变化作出快速反应,并保持非易失性(连贯性)。有些APS产品或规划引擎,可提供不间断的规划功能。如OptaPlanner规划引擎就提供了Real Time Planning特性。这种特性非常适合于一些对规划动作要求作出实时、不间断应变的场景。例如VRP,车间作业指令等规划场景。实时规划系统在完成一轮规划后,系统并未结束运行,而仅结束了规划运算行为,进程仍处于就绪状态,一旦因计划的对象或其它要素发生变化,即会触发新一轮规划运算。在实践中发现,实时规划运算不仅能让系统具,对变化具备实时反应能力,且对于前后两次的规划行为,可以好地保持规则的连贯性(后续将会相关文章详解规划的易失性问题)。即非实时计划前后两次规划的连贯性,在实时规划中更容易实现。因为对于非实时规划,前后两轮的规划运算面对是两个不同的数据环境,第一轮规划的上下文无法完全传递到第二次规划运算中。而实时规划因为其系统的规划进程并没有结束,仅仅是结束了规划运算,处于“暂停”状态。因此,实时规划当接收到重启指令后,它是完全沿用上一轮规划所得的上下文环境,从而更能确保规划的连贯性。其实需要保持计划的连贯性并非易事,需要在建模时作出一定的考量,并以相关的约束或其它限制方式,对引擎的规划行为作出一定程序的限制。
Optaplanner目前是Apache基金会的一款开源软件,JBOSS社区,基于Apache开源软件协议,该协议对商用友好,因此可以自由地将该技术的部门或全部应用于商用软件项目中。该项目目前由受雇于Redhat的团队在维护.其创业人Geoffrey De Smit先生作为该项目的Leader. 其实Optaplanner已发展了十余年,最初是由Geoffrey在参加运筹规划大赛中,针对各种竞赛题目 开发的一个求解器。后来将它贡献给开源社区,并作为开源项目一直维护至今,其版本发布仍十分高效,除进行一些对用户透明不可视的算法与架构优化外,不时还有极具价值的新功能与新特征发布,如7.09版本发布的多线程支持,本人认为是极具里程碑意义的新特征,可以令对运算资源敏感的求解过程,最大程度上提高对CPU的利用率。
Google OR-Tools
Google OR-Tools, 顾名思义是由Google提供的一套运筹规划的运算工具,它针对不同的规划场景,提供了不同的求解器(以组件方式提供)。OR-Tools同样是基于Apache开源软件协议,它是由受雇于Google的Laurent Perron博士带领团队维护。OR-Tools的讨论区讨论相当热烈,主要原因是它的使用方法与传统商用的求解器(如Cplex, Gurobi等)相当类似,因此相当一些运筹学的学者、学生对该软件比较感兴趣。
而Optaplanner则更趋向解决具体的业务问题,从其诞生的背景可以得知,它主要是为解决具体问题而生的。关于 Optaplanner的来历,可以参考其作者Geoffrey的一篇博文《A decade of OptaPlanner》。尽管Optaplanner与OR-Tools其核心是相当接近的,都是通过各种启发式算法,对NP-Hard问题寻找相对最优解。但Optaplanner考虑到非运筹专业人员的数学功底,对问题多做了一层封装,将程序中描述业务问题的各种对象,转换成相应的规划模型,再进行规划求解。从而在商用软件开发环境中,普通的程序设计人员,只需要关注具体的业务细则,根据Optaplanner提供的模式,建立合理的对象模型,来反映业务模型,确保这些业务模型能准确地反映业务需求即可。而无需再将这些业务模型转换成可运筹学上数学规划所需的数学规划模型。从而大大降低了规划程序的开发难度。