OptaPlanner实用技术 - 批量规划和实时规划(2)
作者:互联网
上一篇我们分别对“批量规划”和“实时规划”作了详细介绍;OptaPlanner的这两种开箱即用的特性在具体的工程实践中极为实用。
批量规划可方便巧妙地解决多数据集同时规划,可有效提高算力资源应用效率。此外,在规划服务设计方面,基于批量规划功能,可设计更为简洁可靠且高效的的异步服务方案。引擎在执行多个数据集并行运算时,可根据引擎配置来安排有多少个CPU核心参与规划运算过程,也可使用引擎默认的CPU调度方案,实现服务程序的稳定性与性能的最佳平稳。
实时求解则是OptaPlanner特有功能,暂时未在其求解器中发现相关功能,若引擎本身不支持规划运算启动手,对数据集变更的响应能力,我们自己基于一个求解器来设计一套即时响应机制,还是有一定难度的。特别是规划运算进行过程中,若求解器不提供相关接口,目前还是没有可用的办法实现功能的,该功能的工作过程为:拦截运算过程 -> 更新数据集 -> 基于拦截前最佳方案继续规划。这3个步骤中的第1步与第3步,必须由引擎提供相关的API才有可能实现。因此,OptaPlanner提供的实时规划功能,在面对实时调度场景(例如:呼叫中心座席调度、AGV设备调度,基于VRP的实时车辆指挥等)时,可以提供官方正式的API来实现。且8.X之后对这些API作了进一步的简化,只需一个接口的实现,即可实现对规划过程中的数据集进行更新。因为OptaPlanner对在规划的方案实行的是Delta优化(即规划过程中,实现的是增量、差异优化),因此,在接收到变更请求后,会以极高的速度计划出一个变更后的解并实时输出,这种特性在实时性要求高的场景尤为重要。
既然这两种功能都相当实用,那么有没有办法在一个系统中同时实现这两个功能呢?也就是,我们能否将一批数据集同时提交给规划服务进行规划,在规划过程中,若有些数据集产生变更,我们只需将变更提供到引擎中,引擎可以对变更的数据集产生即时响应,即时输出该变更后的新解呢?
在8.17.0.Final版本之前,这个要求还没有办法实现的。因为本人在自己经历的项目开发工作及咨询服务过程中经常会遇到需要实时规划的过程;而通过SolverManager实现批量规划在该功能推出后,也成为求解数据集的常用方法(现在功能上较少用到简单Solver进行求解)。但如果将上述两种特性结合在一起使用呢?为此,我还碰过一次壁。当我将原来的单次规划代码修改成批量规划后,发现SolverManager并没有提供实时规划相关的API。OptaPlanner团队的Goeffery给了我一个明确的答复,这确实是SolverManager一个接口断层(an API gap on SolverManager, 见以下邮件回复). 也就是说,可实现批量规划的SolverManager接口,在未支持实时规划就发布出来了。因此,但由于实时规划在业务场景中是必要需求,因此,我只能重新将SolverManager改为普通的Solver。
不久,在8.17.0.Final版本,SolverManager终于实现了批量+实时规划了。
与此同时,OptaPlanner还对实时规划的接口进行了简化,在以往的版本中,需要分别实现Problem Fact Add/Delete(将Problem Fact, Planning Entity的添加、移除变更分别实现)。而新的实时规划接口中,会把这些变化统一为数据集(Problem)的变更,因此只需使用一个接口,在这个接口中针对不同场景编写一个Problem中的各个实体变更逻辑即可。从而大大地简化了实时规划接口。
可参考以下示例代码,调用接口,编写实时规划逻辑。
public class SolvingService { @Inject SolverManager<CloudBalance, Long> solverManager; // (1) public void startSolving(Long problemId) { solverManager.solveAndListen(problemId, this::loadProblem, bestSolution -> saveSolution(problemId, bestSolution)); // (2) } public void addComputer(Long problemId, CloudComputer computer) { solverManager.addProblemChange(problemId, (workingSolution, problemChangeDirector) -> { // (3) List<CloudComputer> computerList = new ArrayList<>(workingSolution.getComputerList()); workingSolution.setComputerList(computerList); problemChangeDirector.addProblemFact(computer, computerList::add); }); } private CloudBalance loadProblem(Long problemId) { // Load the input problem identified by the problemId. } private void saveSolution(Long problemId, CloudBalance cloudBalance) { // Save the best solution, or send it to UI, etc. } }
更详细的API使用,大家可以参考OptaPlanner的用户手册或其JavaDoc。当然大家需要根据自己的规划服务架构,对实时规划功能进行合理设计。
上述是当前OptaPlanner在批量、实时规划的一些实用技巧,供大家参考学习。
>>>>>>>> 彩蛋环节 <<<<<<<<<
OptaPlanner及APS、VRP等场景的应用相关的分享, 本人已断断续续写了超过30篇文章(在知呼、博客园、csdn、[让APS成为可能]公众号等平台均有发布)。本人也将开始职业的下半场 -将基于OptaPlanner开发一套适用于国内制造、物流、交通等领域的规划平台。此平台将作为本人接下来开展新一轮事业的基础,预计将在6月初发布一个云端试用版,供有需要的客户、网友和各位老师研究。若有合作机会及适当的应用场景,可基于该平台根据具体业务场景开展一步定制。从而定制开发一套灵活实用的APS、VRP及其衍生系统。
关于该平台,本文先以Q&A方式作简要介绍,接下来会推出一系列相关文章、视频,以模块、业务场景为单位,按章节进行有系统地说明。
Q: 能简单能介绍一下该平台吗?
A:该平台我暂时将其称为易规划平台(Easy Plan Platform), 它由多个模块构成,各个模块针对一个典型的规划场景,当前的主要目标是实现PJS模块和VRP模块:
PJS模块:即基于Project Job Scheduling模型,模块适用于APS(生产计划排程)和项目计划排程。该模块在常用的PJS模型的基础上,实现了资源在空间与时间上的细分,从而解决了“多工序多资源”规划场景下的难题,并自行开发了各个约束与优化目标的评分逻辑,从而极大地提高了规划运算效率。该项目改善设计将会成为本平台首个专利设计提交申请。同时,该模块提供项目计划(大型装备、船舶制造及建筑施工等项目)优化接口,用于接收项目计划规划的元素(例如:项目,任务,资源等),可实现大模块项目计划排程优化。
VRP模块:目前主要可应于经典的CVRPTW(Capacitated Vehicle Routing Problem with Time Windows)场景,具体的业务需求,可在此基础上进一步扩展。此外,基于VRP的模块扩展“AGV调度”和“固定节点运输任务调度”场景。
Q:该平台适用于哪些场景?
A:如前面对该平台的介绍,目前平台主要针对APS、VRP两个场景。后续将根据市场反应与实际需求,陆续推出Call Center Scheuling(呼叫中心、预约控制调度),Conference Scheduling(会议、讲座日程规划),Facility Location(设施选址规划), Maintenance Scheduling(日常维护工作调度),Rostering(人员排班)和Inventory Scheduling(库存优化)等模块。
Q:该平台是一套系统,它有何用,可直接部署给终端用户使用吗?
A: 该平台目前的定位为针对以下两种场景:
- 市场现成运筹规划产品(如APS, VRP类的产品)灵活性差,无法彻底满足企业个性化业务需求。可基于我们的平台,在成熟通用的规划模型基础上,灵活实现个性化定制要求。
- 对系统有灵活性、甚至原创性要求,但缺少从头自研的运筹优化、应用数学人才资源的团队;可在我们平台的基础上进行系统研发。
Q:若有意应用该平台,如何合作?
A:如上述关于该平台的作用说明。针对不同的场景可提供相应的合作方式。对于有自研需求的终端用户,可提供基于企业业务场景的定制化扩展。对于有产品需求,可考虑基于本平台的一些模型实现,进行产品自研,但平台的设计技术、代码版权归属,需要进一步商讨。
关于该平台的更多信息,会接下来的各篇文章中介绍,并在6月初平台发布时统一发布。敬请期待!
Q: 该平台与市场上现有规划类产品,及各位专家的方案有何区别?
A:与现成产品区别 - 平台更低成本、灵活、可控,因为平台底层每一行代码都由本人编写,有任何不合理、不科学的地方均可修改。
与目前网络上各位APS、VRP、规划调度理论专家的方案区别 - 该平台是一个具体的软件系统,是基于OptaPlanner这个接地气的求解器的一个具体工程化实现。各位专家、老师提出的很多理论、算法和方案,都用具体的设计、结构逻辑加以实现。而不是空有理论、方案,难以落地实践的空中楼阁。更不是仅使用分配或排序逻辑简单堆砌的伪运筹规划系统。如:OptaPlanner实现了各种启发式寻优算法,PJS模块实现了 工艺+订单=任务排程过程的业务实现,并使用成熟的PSJ模型实现了多工序关联、多资源制约的排程;通过Springboot+引擎的批量、实时规划功能,实现了基于Web服务的规划运算节点,并实现完整的内存运算功能。
对着这些代码2个多月了,平台将作为我家的3胎
另外,本人目前大部分工作时间已投身该平台开发,经历2个多月的研发,平台已初步成形(规划核心已完成,演示系统及文档正在准备中),接下需要进行不断改进、重构和推广合作。日后OptaPlanner相关的文章预计将会逐步减少,望诸位见谅,但并不代表从此不再出OptaPlanner应用相关的文章,对于该软件的一些里程碑式的更新和功能,我还是会尽可能推出文章分享给大家。对于OptaPlanner的学习交流,之前有些网友不理解,对于简单的技术问题,在我时间允许的情况下,留言给我,我会尽可能回复,但因为我不了解各位的业务场景,不可能太具有针对性。同时,有网友埋怨本人分享知识太少,本人实属无法认同。毕竟本人也是以OptaPlanner规划技术谋生的职场或商场普通技术人员,OptaPlanner本身是开源,但不代表我的知识也是开源的,分享相关入门知识和技术,只是希望中国的OptaPlanner应用生态圈慢慢成熟。但这并不是我的责任,我只是凭兴趣为之的义务工作。望各位海涵!
详细的合作方式,可以与本人联系 13631823503 (微信同步)
标签:场景,OptaPlanner,实现,实用技术,平台,实时,规划 来源: https://www.cnblogs.com/kentzhang/p/16339389.html