背景
在过往参与的一些项目支持工作,以及平台发布后各位小伙伴使用过程中,经常遇到这样的问题:你这个引擎性能怎么样?可以处理多大数据量的排程?我有数万个任务,这个引擎多长时间可以排产结果? 这个问题会引出整个生产计划过程中计划方式的问题。本文将分3篇探讨对于此类问题的3个不同维度的解决方案,分别是:
- 分阶段规划 - 解决大规模规划问题的粗、细规划方案
- 分区规划 - 解决大规模规划问题在空间维度上分区规划方案
- 持续规划 - 解决不同计划周期之间的连贯性问题
- 实时规划 - 实现对时间要求高的实时作业调度方案
规划问题属于NP-Hard问题
事实上关于规划引擎运算出结果,可能大家有点误解。需要使用求解器(OptaPlanner就是一个求解器)进行规划运算的,通常是一种称NP-Hard的问题。相关概念大家可以自行搜索,通俗一点讲,就是一种没有办法通通有限时间算法推导出结果的问题,只能对它的解空间进行搜索,找到一个最佳结果;但事实上这些问题的解空间非常大,可以理解为,当一个NP-Hard问题规划(即数据量)足够大时,它的解空间并不是目前世界的电算机算力可以遍历完的。需求解器就是内置了一种叫做启发式算法的逻辑(例如遗传算法、禁忌搜索法)用于提高获得更佳解的效率和机率。那么NP-Hard问题的解空间有多大呢?以图是OptaPlanner在对一个俗称为八王后问题的大小计算。这个问题已经是各种NP-Hard问题场景中几乎最为简单的场景了。
N王后的问题大小
现实中的大规模规划问题
而我们在规划过程中,面对的APS(生产、项目排程),VRP(车辆路径规划)等问题,因为其复杂程度高得多,导致问题规模,也就是问题的解空间比八王后问题大得多得多!如果一次过规划数万个任务,甚至上万个工单,按工展序开后超10万的任务。对于NP-Hard问题来说,已经属于超大规模问题了,当然除了数据量外,问题规模还需要考虑约束的复杂性,越复杂的约束运算所需时间越多。事实上,而对这种规划的排产问题,我们需要一些技巧来对问题进行化简,而不是一味追求高性能的程序来处理, 当然建立调质量的模型来提升规划效率,也需要不懈努力,不能停止。
其实,真正产生这种超大规模规划问题的场景并不多,很多情况下是人们未能从本质上理解场景,未对问题进行合进的分析、演化和化简而导致的。若不采取合理的优化措施,只是看到一个简单的规划问题,然后就简单粗暴地建立简单的规划模型,就直接提交给求解器进行求解,就算当前的场景能解决,以后随着数据量增大,约束增加,最终还是出现无论如何增大计算机运算能力都处理不了的时候。
本文将分两篇探讨一下对于这类“超大规模问题”的处理方法,本篇会从业务角度对问题这类问题进行分析,展现一下如何通过滚动计划的方式,对规划数据在时间上进行由粗到细、分阶段划分,实现远粗近细的多层次规划,从而避免一锅端方式带来的对算力的无尽浪费。各位小伙伴可以根据自己的业务场景分析一下,这种方式能否优化大家的业务需求。
分阶段规划
场景
我们做软件开发项目管理过程中,都需要制定项目计划,需要对未来项目工作的进度与资源分配,根据当前认识的条件作出一定程度的预计,即由谁在什么时间完成什么工作。对于一些规模较大的项目,当然持续时间足够长时,我通常会使用滚动的方式来制定整个项目计划 - 称为滚动计划。即对于时间较接近,资源情况较为有把握的部分工作,需要精准安排时间、调配资源的工作,需要定出尽可能准确的作业任务;而对于时间较靠后、资源安排较不确定的工作,则可以暂时制定较粗的原则性计划。因为时间较远的工作,资源确定性差,其依赖工作确定性也不高,制定过于精确的计划其价值并不大,却会造成极大的工作浪费。
区分精粗计划
对于我们生产制造场景亦然。在我们实际的生产制造企业里,销售工作是持续进行的,客户下单所需的交货其也千差万别,交付方式也各单差异巨大。有可能同一个月获得的销售订单中,各个订单的交付期分配在未来一个月到半年甚至一年时间。也有可能有些战略型的订单下的是未来整个季度或半年的总订购量,这个总量却是在未来的大段时间分阶段交付的。基于滚动计划的原则,对于近期需要加货的订单,我们可以制造精确的精细生产计划,即通过APS对这类需求的工单进行资源分配、时间排序,从而获得一个精准的生产作业序列。而对于一些可能需要一个月甚至两三个月后才交付的订单,因为生产这些订单产品所需的资源(原料、产能等)以当前的条件预判来说,可靠性极差。例如:未来3个月的工人班次、生产设备维保计划、原料订购计划等都未确定。因此,对于这类交付不急且依赖因素不确定的订单我们可以对其排出一个主生产计划,即MPS,一个以订单为规划对象(而非工序)的粗放计划。它的各个要素可如下定义:
- 计划的对象是订单,或子订单(即大的战略项目划分成多个子订单交付)
- 预估每个订单的持续时间与产能需求
- 对需要采购的外部产能假设为无限
- 对未来的产能做大概预估。
以下是OptaPlanner用户手册中一个,使用多阶段规划处理铁路时刻表的示例
![](https://pic1.zhimg.com/80/v2-8d6c0b88cec52c95c7c66eecf940da08_720w.jpg)
通过上图我们可以看到一个简化的铁路调度时间策略示意图。因为在空间上,全国的铁路形成一个网状关系,而且各个车次对铁路的占用具有独占性要求,各个区域和车次调度需要通盘统一考虑。但是从时间上来看,从粗到细,按以下三个层次进行区分:
- 战略计划(或称战略规划): 对于以月来单位、计划时间是未来月甚至数年的部分,可以制造一个战略计划。例如未来一年哪个地区客流、物流需求受各种政策影响,需要对用量、负荷作出一个粗放计划,其目的是用于对铁道、站台等配套设施的调整。
- 战术计划: 对于未来一到两个月的运行计划,制造一个以周为单位的战术计划,即计划到每周的工作调配。通常用于人员安排等较近期的工作调度。
- 运营计划:对于我们普通人接触到的列车运营时刻表,则需要作出最为细致的计划,它的运营精度会确定到分钟;而发布时间则细到按小时发布, 相当于我们的实时规划,因为铁路运行情况时刻在变,我们平时遇到的晚点、加开等事件与措施,主是在运营计划中产生的。
同样地,对于我们企业中各个层次的计划,也可以据此划分,分为以集团为单位发布,精确到月分、涉及未来一年的粗放规划,主要作用在于作为运营决策。再针对每个生产单位(生产厂或车间)发布未来一到两周的生产计划主要用于资源调配。而最细的则是车间中调度部门制定的具体作业计划,精确到每条产线、或每个机台、每个工位;其目标是安排每个产线、设备的具体作业工作。当然,各种具体的场景需要视实际情况划分,有可能只需要两个层次,也有可能需要划分到更细-四层。每个层次都可以使用规划技术进行运筹优化,从而获得一个相对最优的计划方案。但解决每个层次需要建立的规划模型肯定是不一样的。我们的通用智能规划平台,下一个目标就是实现精细两个方案的衔接。即在MPS阶段对各个订单进行优化分配,在此基础上对所产生的工单进行展开、分配资料、排定加工顺序与依赖关系。当然,未来我们还会提高层次的战略计划,其目标是提供一个产能预测、MRP等领域的优化引擎,从而实现更高层次的规划优化。并把不同层次的优化有机衔接起来,以杜绝每个层次部署各种异构系统带来的过度建设问题。
本篇我们先讨论企业中整个计划过程按阶段划分的问题。下一篇我们讨论这个过程中另一个方案 - 持续规划
《End》
以下是一翻推广:
诚邀大家使用我们的【易排通用智能规划平台】,它基于OptaPlanner对APS的一些常用规划逻辑进行封装,大家只需要管理、维护好自己系统(使用MES、MOM、ERP中的计划模块)中的工单数据,即可快速地实现一个APS模块。后续我们还会添加【VRP - 车辆路径规划】和【在线调度】模块,敬请期待。可以通过以下链接查看更多该平台的使用方法。
与平台相关疑问,可以添加本人微信探讨,或关注我们的公众号【让APS成为可能】及时接收相关消息。