之前的文章中,分别从APS,排产到规划引擎叙述了一些理论基础;并介绍了一些Optaplanner大概的情况;并一步步将Optaplanner的示例运行起来,将示例源码导进Eclipse分析了一下它的Hello world入门示例,从本篇开始,我们将分步学习它的一些概念及用法。
什么是Optaplanner
其实这个名称是作者将这个引擎贡献给了Jboss社区后,才使用的名,之前叫做Drools planner。没错,它就是结合Drools(一个开源规则引擎)一起应用的(也可以单独使用),Drools在这里的作用主要是用来作编写计分脚本,事实上完全可以抛开Drools,直接使用Optaplanner自己的API,通过Java代码自己来计分,但这个难度就大得多。详细情况计到相应的章节再细说。
名称的前缀应该是Optimize的词根,或取近音吧,因为Optaplanner其实就是一个对待规划的方案组合进行优化的引擎。好了,关于它的名称就不花费太多的口水去深究,我们看看官方是怎么定义Optaplanner的。"OptaPlanner is a constraint solver. It optimizes business resource planning use cases, such as Vehicle Routing, Employee Rostering, Cloud Optimization, Task Assignment, Job Scheduling, Bin Packing and many more. " - Optaplanner 是一个约束解决器,它可以优化业务资源,规划各种案例,例如车间调度,职员排班,云优化,任务分配,工作排程,装箱等相关的问题,例如下图。
而我对Optaplanner的理解,它是一个Planning Engine - 规划引擎,针对各行各业的业务需求,开发人员需要将一些业务规则翻译成约束,并对业务场景中的实体进行抽象建模,规划引擎根据上述约束和模型对象进行规划,找出一个相对最优化的方案出来返回给用户。其实如果需要规划的业务对象不多(种类和数量都不多),规则不太复杂,人类是可以通过自己的经验、推算和规则运行,得到一个可行方案的,甚至当问题规模足够小的时候,是可以找到一个最优方案的。关于规划问题,大家可以参考这个系统文章中的一篇入门介绍《Optaplanner - 入门介绍》,里面讲到,规划问题其实就是数学上的NP问题或NPC问题,目前数据世界对于这种问题,是没有可用算法直接实现的,当问题足够大的时候,只能够通过一些寻优算法(例如爬山算法,模拟退火及遗传算法等)提高找到问题相对优解的机率。而Optapla