大家知道,无论商业的运筹学产品比如cplex/GUROBI,还是开源的运筹学产品,都有约束优化求解器sat求解器,并配上车辆调度,车间调度的例子
而且不算商业约束优化求解器,开源约束优化求解器也都有40年的历史了
可是奇怪的是,aps产品却都不用约束优化求解器做排产算法引擎,比如西门子optcenter aps用的是规则法和模拟仿真, sap aps(pp/ds)用的规则法和并行遗传算法,asprova用的是规则法,达索aps用的是规则法和模拟仿真,免费的isuperaps用的是规则法和并行遗传算法,开源的dream用的是模拟仿真,开源的frepple用的是规则法
aps产品在后台配上约束优化求解器是技术再容易不过的事情了,为什么都不用呢?
这是因为,约束优化sat求解器只能求解教科书极度简化的车间调度/生产调度问题,而无法解决实际的高度复杂众多约束的生产排产排程问题
1 教科书的车间调度问题一个订单的任务都是串行关系的,而实际的生产排产排程中,订单的任务都是大量存在并行关系
2 教科书的车间调度问题一个任务只能安排一个机器运行,而实际的生产排产排程中,一个任务可以安排在很多可选择机器上运行
3 教科书的车间调度问题不考虑休息时间段,或者要求任务和休息时间段不能重叠,因为任务的生产时间要事先就确定,不然无法建模,而实际的生产排产排程中,任务跨休息时间段是最常见的,由于跨休息时间段,所以任务的生产时间并不能事先确定,而是具体分配到跨某段休息时间段时再来计算生产时间
4 教科书的车间调度问题不考虑副资源,而实际的生产排产排程中,大量产品的生产都需要副资源的参与
5 教科书的车间调度问题不考虑也无法考虑已经生产的任务,而实际的生产排产排程中,存在很多正在进行的生产任务
6 教科书的车间调度问题也不能处理将一部分正在进行的任务或订单固定,重排其它任务,更不能插入订单,而对实际的生产排产排程,这都是非常常见的场景
教科书把车间调度问题极度简化,是因为实际生产排产排程的大量约束条件根本无法通过整数规划方程组表示,所以都去掉
约束优化求解器求解调度问题,本质上是求解一个整数规划方程组,对于大量约束条件无法用整数规划方程组表示的问题,自然就无法求解,这就是为什么aps产品都不用约束优化sat求解器作为算法引擎的原因
这也是为什么在运筹学工具的开发者大会上,都会举出约束优化求解器在排课,排班,车辆调度等这些约束条件比较简化明确的调度领域的实际应用,而对生产排产排程的实际应用避开不谈
其实不光是生产调度,很多领域的优化问题本质上也是一个调度问题,比如大规模集成电路设计软件eda的布局优化问题(这是芯片设计里需要人力最多的工作),就可以转成一个生产排产排程问题,国内的eda开发商都是用sat求解器来做,虽然技术上容易,但效果很不好,国外的eda公司则更多的使用遗传算法进行布局优化搜索