提到的资源,是指需要完成一个生产作业(或称任务,生产任务)所需的生产条件,例如机台、原料等,称为广义资源。
对于生产计划,常见有以下四种类型:
- 单一工序,单一资源种类.
- 单一工序,多资源种类.
- 多工序,单一资源种类(较少见).
- 多工序,多资源种类.
下面对上述四种生产计划进行逐一分析,本文的分析,着重于计划的优化实现,而不是硬性规则的确保。例如通过工序的就绪情况来确定资源的就绪要求,例如MRP等,这些硬性的约束可以通过规则引擎(例如
实际多工序多机台生产计划中的约束
在实际制造中,除了上述讨论的三个主要约束外,还会存在非常多企业自身业务场景相关的限制因素,会更大程度上限制生产活动的执行。而这此限制需要正确地反映到生产计划中,否则最终产生的计划就无法执行。本文只列出对生成计划的正确性有影响的、各计划均会存在的共性因素;而那些与各个行业、企业的业务相关的个性化因素,则不在本文考虑范围内,各位在自己设计系统时考虑即可。例如:印刷行业中的印刷后加工工序,做完洒金粉工序,是需要等待一定时间,令金粉固化后,才能进入下一工序的,那么也就是说这个工序与下一个工序之间存在一个最短时间间隔的限制,否则是会产生质量事故的,因此是一个硬约束。
任务死循环的检测经验
因为生产计划的复杂性,造成工序任务链与机台任务链之间存在异常复杂的制约,需要对Optaplanner产生的可能方案进行合法性判断,识别任务的开始时间推导过程中,是否存在死循环的可能,则需要非常严谨的逻辑分析与正确的模型与算法设计。现分享一下本农在此类项目中,在这方面遇到的问题。
当时我把机台任务链、工序路线任务链设计出来,并明确了模型中各实体的职责和关系后。发现了时间推导存在死循环的可能。因为我认为对Optaplanner将要规划出来的可能方案中的各种任务的关系已经有足够认识,就根据推导过程中可以出现的情况进行死循环检测,检测过程也相当简单。因为当一个可能方案中任务的时空关系一旦确定之后,所有的任务即构成了一个有向图(directed graph),那么我检查这个有向图是否存在环即可。我尝试过使用队列结构对这个图进行广度优先遍历,并识别环是否存在。也尝试过通过递归方式进行深度优先遍历(其实递归使用的数据结构就是栈,知晓VC++的同学应该从WinAPI32编程中学习过函数调用的机制,其实调用调用路径就是一个栈)。无论怎么尝试,检测结果就是无法完美、全面。因为我们项目中需要考虑的因素更多,出现意想不到的可能性更大。因此,有段时间我自己都觉得,不太可能解决这个问题,盟生了放弃的念头。幸好我遇到一个好领导,我的老板(我们这里都叫上级做老板)Jeffrey给了我非常多机会和支持,并不时跟我一起分析,他也了解到问题的复杂性,并给予理解与鼓励。最终我的解决办法是:对Optaplanner在规划过程中产生的每个可能方案,都进行模型上的抽象与简化,去除一些不影响死循环判断的因素,把它归约成一个正正式式的有向图,并通过一些成熟的有向图环检测的算法对其进行判断。其实思路主就是:把之前根据复杂的业务规则实现不同的逻辑进行分支检测的方法,倒过来,将含有一些业务因素的有向图,归约成数学算法可以处理的规范有向图,再对其进行检测。目前这个功能已经相当稳定,再她不会时不时出现意想不到的情况了。关于有向图的环检测算法,网上有很多,大家自己找或者自己研究都能弄出来,就不在本文深究了。
通过Selection Filter对不合法方案进行过滤
其实若我们只研究本文中提出的多任务多机台生产任务的最基本三个约束的话,上文提到的不合法方案就只剩下任务死循环方案了。若在现实项目开发中,一个方案不合法的定义会更多,更丰富,且更复杂。一旦我们通过各种手段检测出一个方案是不合法的。我们就可以通过Selection Filter,在Optaplanner对的VariableListener对象的afterEntityChanged事件处理方法之前,把事个move放弃掉。关于Selection FIlter的用法,大家可以先从Optaplanner的开发手册中查看,我将会专门撰写Selection Filter相关的文章 对其进行说明。
小结
自此,本文描述了基于Optaplanner设计APS排产引擎时,遇到比较棘手的问题。包括:计划类型的识别,由任务组成的工序链与机台链,任务与机台之间的匹配,工序链与机链之间的胶着可能性与循环识别与处理。希望能帮到大家。
本人也是初初研究APS排程引擎,都还是在不断探索中,有不正确的地方,还请多多提点。为谢。
如果对此大家有何建议,欢迎大家加我企鹅一起探讨,Q:12977379或V信:

其实 Optaplanner规划引擎不需要对Java过份精通即可使用,因为它使用到的都是Java最基本的知道,但还是需要有基本的Java知识才行,希望大家找我研究讨论时,如果Java, Maven等方面仍接触较少,请大家先行自补该方面的知识,本猿暂时只能跟大家探讨Optaplanner, Drools的应用,而Java相关的知识,恕无法提供有效的帮助,毕竟本猿也只是个Java新手。先谢了。https://www.cnblogs.com/kentzhang/p/9600973.html
