ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

车间调度问题分类全解析:从单机到作业车间的模型选择

车间调度问题分类全解析:从单机到作业车间的模型选择 车间调度Job Shop Scheduling这个词我在制造业圈子里待得越久越发现它的外延已经被撑得很大了。做APS高级计划排程的人一开口就是“车间调度”做MES制造执行系统的人也在讲“调度模块”搞精益生产的老师傅也会聊“排产计划”。问题是这几拨人说的“车间调度”根本不是同一个东西——有人关心的是流水线上的节拍平衡有人关心的是几十台CNC数控机床上的工序排序还有人一上来就问“机器坏了以后怎么快速重排”。这些场景背后的数学模型、求解难度、系统架构差别极大如果不先把分类搞清楚后面做的所有优化都可能是在错误的方向上白费力气。所以我想写一篇梳理文章把车间调度问题的分类这件事彻底讲透给正在做产线数字化、APS选型或者自己写排产算法的朋友一个可以反复对照的参考。1. 车间调度问题的通识框架到底在解什么题在聊分类之前必须先建立一个共同语言。车间调度问题之所以被学术界和工业界研究了半个多世纪是因为它有一个非常简洁却极其通用的框架给定一批加工任务和一批加工资源在满足一系列约束条件的前提下确定每个任务在每台设备上的加工顺序和开始时间使得某个或多个生产指标达到最优。1.1 调度问题的三要素工件、机器和约束车间调度里的“工件Job”不等同于财务管理上的存货单元也不是MES里的一条工单。在调度建模里一个工件通常代表一个需要完整工艺加工的订单或零件批次它有明确的加工路径工艺路线由若干道“工序Operation”组成。比如一个机械加工件可能要先车外圆、再铣端面、最后热处理这三道工序构成它的加工路径。“机器Machine”同样比字面意思更泛化。它可以是一台具体的车床也可以是一条热处理线、一个装配工位、一组焊接机器人甚至是一个检验工位。在调度问题里机器的本质是“在一定时间内只能被一道工序占用的资源”。约束条件则分两类。一类是硬约束比如工序之间的先后关系、机器同一时间只能加工一个工件、工件同一时间只能在一台机器上加工、加工开始后不可中断等。另一类是软约束比如优先级的倾向、交货期尽量不拖期、换型次数尽量少等。硬约束违反会导致方案不可行软约束违反只是评价变差。这三要素构成了调度的“骨架”而不同的机器环境、工件特性和目标函数就成了划分调度问题类型的三根“坐标轴”。1.2 调度问题分类的标准表达α|β|γ三域表示法科班出身的朋友应该听过Graham等人提出的三域表示法也就是用“α|β|γ”这样一个三元组来精确描述一类调度问题。这是把调度问题分类规范化、系统化最经典的工具很多论文、算法库甚至商业APS软件的参数配置里都在用。我简单拆一下α域描述机器环境比如“1”表示单机“P”表示相同并行机“Q”表示不相关并行机加工速度不同“F”表示流水车间所有工件按相同顺序经过所有机器“J”表示作业车间工件各有各的工艺路线“O”表示开放车间工序没有固定先后顺序。β域描述工件特性或加工约束比如“rj”表示工件有到达时间“pmtn”表示允许抢占加工“prec”表示工序之间有优先约束关系。γ域描述优化目标比如“Cmax”表示最小化最大完工时间“Lmax”表示最小化最大延迟“∑wjCj”表示最小化加权完工时间之和。举个例子“J2|rj|Cmax”表示一个两机器的作业车间调度问题工件带到达时间目标是让最后完工的工件的完工时间尽量早。而“F3|pmtn|Cmax”表示三机器的流水车间允许抢占同样是最小化最大完工时间。notation虽小写清楚之后问题类型和求解方向就明确了一大半。1.3 分类的意义不同类的复杂度可以差出天际车间调度问题分类不光是学术上的事情它直接决定了你解决这个问题要用什么级别的算法。单机调度里最简单的情形构造一个排序规则比如按加工时间最短优先SPT就能逼近最优解但到了柔性作业车间调度问题FJSP机器指派和工序排序双重耦合即使工件数量只有10个、机器只有5台穷举搜索的空间也足以让普通计算机跑到怀疑人生。我见过太多实际案例某个车间说是上了APS结果系统用的还是最早交期优先EDD加人工干预的规则算法原因是这个车间其实就是单机瓶颈加并行设备根本没到需要大规模搜索的程度。反过来也有朋友拿着仿真软件去模拟柔性产线反复调参数调不好后来才发现自己本质上是柔性作业车间调度问题需要用到遗传算法或者约束规划仿真只是验证层不是求解层。这就是分类没搞清楚的典型代价。2. 按机器环境划分调度问题最经典的分类维度机器环境的差异是调度问题分类最本质、影响最深远的分水岭。学术界关于调度的教材和论文几乎都是按这个维度来组织章节的。对于工厂里的工程师来说搞清楚自己所在产线的机器环境就等于给排产问题画好了坐标系。2.1 单机调度最简单也最容易被低估单机调度的符号是“1”指的是所有工件的所有工序都在同一台关键设备上完成或者更常见的解释是整个系统有一个绝对的瓶颈工序其他工序产能充裕对排产结果不产生约束影响。这时候整个问题就被约化成“如何安排这些工件在这台设备上的加工顺序”。单机调度典型出现在瓶颈设备的排程场景比如注塑车间的几台大吨位注塑机、PCB印制电路板行业的光刻工序、半导体行业的炉管设备这些都是产能瓶颈其他环节跟着它跑。别看机器只有一台单机调度在目标函数不同时难度天差地别。最小化最大完工时间用WSPT规则按加工时间与权重比排序很容易得到最优解但一旦加上工件有不同的准备时间、切换成本、交货期窗口甚至允许工件分批复杂度就会飙升到NP-hard。我在实际项目里见过一个芯片测试工序只有6台测试机但每颗芯片有十几道测试类型、每类测试之间还有温度循环的要求排产方案的好坏直接影响出货节奏。当时团队差点误判成简单排序问题实际花了大力气才把状态空间约束建完整。所以遇到单机问题先别急着说“简单”。要问三个问题这台设备的换型时间是否和加工顺序有关工件的到达时间是统一还是分散优化目标是什么这几个问题决定了你能不能拿规则算法直接上。2.2 并行机调度同功能多设备的调度场景并行机调度是单机调度的自然延伸系统中有一组功能相同的机器每个工件只需要在其中任意一台机器上加工一道工序即可。并行机又分成三类相同并行机P所有机器加工同一种工件时速度相同产能均等。均匀并行机Q机器速度不同但存在可换算的速度比例关系。不相关并行机R机器对不同工件的加工效率构不成统一比例关系比如一台高速加工中心加工铝件很快、加工淬硬钢却很慢而另一台通用机床正好相反。并行机调度非常常见。SMT表面贴装技术车间的贴片机群如果配置相同就接近相同并行机柔性制造单元里几台加工中心型号不同对零件的适配度不同就是不相关并行机。包装车间的自动包装线不同线能处理的包装规格不同往往是不相关并行机的变种。对并行机调度核心决策是“工件分配”加“每台机器上的排序”。如果目标是Cmax可以用LPT最长加工时间优先或Multifit算法得到近似解如果想做精确解需要拆成“指派”和“排序”两步迭代。实际做的时候我习惯先用一个数学模型跑小规模确认可行性之后再决定要不要换启发式算法应对更大规模。2.3 流水车间调度Flow Shop产线的节拍与顺序问题流水车间调度Flow Shop是最贴近大众理解的产线调度。它的核心特征是所有工件按完全相同的工艺路线顺序经过所有机器比如先冲压、再焊接、最后喷涂所有订单都必须走这三步不能跳工序也不能倒序。流水车间的符号是F后接机器数量比如F3表示三台机器依次排列的流水车间。如果每台机器之间还有多个可选的并行工位比如焊接工序有3台焊机、喷涂工序有2条喷线就变成柔性流水车间Flexible Flow Shop符号是FF。流水车间调度最经典的求解目标是makespan最大完工时间对应的是产线的“节拍”问题。在机器数量为2时Johnson规则能在多项式时间内给出最优解但一旦机器数量到3台及以上问题就变成NP-hard了。实际工厂里流水车间往往同时存在批次顺序、组批约束比如喷涂颜色相近的放一起可以减少清洗次数、缓存区容量限制这让实际问题的复杂度远超课本模型。我给汽车零部件厂做个一个冲压产线的排程18道工序、60多个工单还要考虑模具换模时间。当时最大的体会是Flow Shop模型本身不复杂但加上模具约束后换模顺序直接影响总换模时间这本质上是调度目标和顺序耦合的问题必须把换模时间表作为输入约束建模而不是当作常数处理。2.4 作业车间调度Job Shop工艺路线各不同作业车间调度Job Shop是制造业里最“硬核”的一类调度问题。它的核心是每个工件有自己的工艺路线工序间的先后顺序因工件而异且不同工件的工序可能在任何一台设备上发生。订单接得越杂、产品越离散越容易落入这类调度。符号体系里作业车间用J表示比如经典的J2||Cmax两机器作业车间。著名的10台机器10个工件的基准问题比如Muth-Thompson 10x10算例在1975年之后才被精确求解可见其难度。作业车间调度的计算复杂度极高因为你要同时决定每台机器上不同工件工序之间的先后顺序而机器之间又通过工件的工艺路线耦合在一起。实际表现就是这类车间很难靠拍脑袋排产也很难用Excel表格维护必须借助优化算法或约束求解器。我在车间里见过最典型的Job Shop场景是刀具厂和航空零件加工厂。每一张订单都是一个不同的零件工艺路线可能涉及车、铣、磨、线切割机器数量30台以上工序数量几百道。这种场景下一个合格的调度方案要考虑的不仅是每台机器的利用率还有零件的等待时间、多个订单之间的插单情况、操作工的可调度性。坦白讲这种问题靠人工经验排产在订单少的时候勉强能维持订单一多必然冒出混乱。2.5 开放车间调度Open Shop工序顺序不限的特殊场景开放车间调度Open Shop比作业车间更松弛工件的各道工序没有事先规定的顺序关系排产时可以在工艺可行范围里自行决定先做哪个后做哪个。符号是O。开放车间看起来约束少但反而因为自由度大导致搜索空间更大。现实中纯粹的Open Shop很少见更多是出现在维修企业、检验实验室这类场景。比如一台设备进厂维修可能同时需要电气检修、机械检修、液压检修三个工序操作人员把三个工序做完即可谁先谁后没有硬性规定具体执行时看谁有空。如果车间只是部分工序顺序自由建模时可以当作“有部分工序顺序可调整的Job Shop”是一个变种。实操中这种问题对模型灵活性要求很高因为工序顺序本身也可以是优化变量这与传统调度的输入方式差别很大。3. 按数据与状态特征划分确定性调度与动态调度车间调度还有另一条重要的分类轴和机器环境无关它取决于你对未来订单和设备状态的信息掌握程度。这条轴线在工厂实际里特别重要因为很多做排产的同行在这个地方栽过跟头。3.1 确定型调度和随机型调度信息可知与不可知确定型调度假设所有输入信息是已知且确定的工件的加工时间、到达时间、工序数、交期都是定值。这是学术研究中最常见的假设也是很多APS软件的默认设定。在制定周计划和批量订单时确定型调度很可用因为订单基本明确、工时相对稳定。随机型调度则承认不确定性把加工时间视为随机变量或者到达时间服从某种概率分布甚至机器故障间隔也是随机的。现实车间永远是随机型占主导因为机器会坏、员工会请假、来料会迟到、工艺还需要调整。区别只在于随机程度大小。做随机型调度有两种常见策略一种是鲁棒调度在编制计划时就留出安全缓冲区、增加设备冗余保证任何单一扰动不会导致全盘崩溃另一种是反应式调度计划正常编但遇到扰动时快速触发重调度。注意真正落地时这两种策略很少分开用而是组合的——先给一个鲁棒基线计划再配合实时的扰动响应机制。3.2 静态调度与动态调度插单、故障与重排静态调度的特点是开始执行前所有待加工的工件已经确定调度方案一次性生成之后不再变化直到全部加工完毕。这在计划层面很常见比如月度生产计划一次性排好。动态调度的特点是工件在时间轴上陆续到达或者执行过程中出现新事件紧急插单、设备故障、订单取消需要不断调整调度方案。动态调度又按照事件驱动方式分成两类事件驱动型只有当异常发生时才触发重排比如设备突然故障、某个关键物料晚到。周期滚动型每隔固定时间窗口滚动重排把排队中的新订单纳入排程比如每个小时滚动一次或每天滚动一次。工厂实际用得最多的是“周期滚动事件触发的混合模式”。我在做汽配厂的MES调度模块时就设置了两层机制平时每小时自动滚动重排一次把新下发的工单插进去一旦有设备报警停机超过15分钟立刻触发该设备相关工单的局部重排不动其他设备的计划。这样做的好处是既保持计划的稳定性又能在必要时快速响应扰动。3.3 可中断与不可中断加工抢占切换的限制这个分类维度考察的是工序一旦开始是否允许被打断并把资源让给别的工件之后接着做。学术上用“pmtn”表示允许抢占preemption不带则表示不可抢占。现实中绝大多数工序不可抢占——你不可能把一台磨床上的精磨工序磨到一半停下来去加工另一个紧急工件再回来继续磨精磨表面质量和设备校准要求不允许这么做。热处理炉这类工艺倒可以近似认为可抢占因为退火工序能被中断把紧急工件先行放入半导体制造中存在批量调度和重入流程抢占概念也常被扩展使用。做调度排产时除非有强烈的现场理由不要轻易假设可抢占否则做出来的计划在现场根本执行不下去。如果确实存在抢占需求建议在模型里至少明确“可抢占的位置”和“允许抢占的时间窗口”不要笼统地建模成全工序可中断。4. 按优化目标划分从完工到交付再到成本车间调度的目标函数决定了解的好坏怎么评价也决定了系统的行为导向。同一个车间、同样的订单采用不同目标函数得出来的最优调度可能完全不一样。这也是“分类”里非常值得业务侧关注的一块。4.1 完工时间类目标Cmax与平均流经时间完工时间类目标最基础的是Cmax即最大完工时间的最小化。它的优先级天然高因为缩短最大完工时间意味着更早完成整批订单产能在单位时间内的产出更多。但是Cmax有个毛病它只关注“最后完工的工件”中间的等待时间再长它也不管。这会导致一个工件被压了很久但只要最后一个能压缩Cmax就好看这对整体在制品库存和流动性并不友好。所以平均流经时间mean flow time以及加权完工时间和∑wjCj被提出来。它们的核心思想不是只保“最后那个”而是让所有工件尽量早完工。这更贴合精益生产的逻辑降低在制品、加速物料流转、缩短交付周期。实际排产时很多APS会把Cmax作为主目标、把平均排队时间作为次目标或者反过来根据企业的旺季与淡季切换。旺季保产出主抓Cmax淡季管流动主抓平均流经时间。这个思路简单但实际执行时需要在优先级设计上仔细处理否则系统会一直盯着同一个目标导致计划僵化。4.2 交货期类目标延迟与拖期惩罚当订单都有明确交货期时目标函数会围绕“按期交付”展开。常见目标包括最大延迟Lmax要求尽量不拖到最坏情况、总拖期时间总Tardiness最小化、拖期工件数量最小化、加权拖期惩罚最小化。拖期类目标带来的排产行为特征是紧急单优先、交期近的单提前、占用稀缺资源插队。这套逻辑在离散制造里很常见尤其是汽车零配件行业主机厂有严格的到货窗口拖期意味着停线罚款比提前交货更伤。而提前交货太多又会带来仓储成本所以更精确的目标是“拖期和提前期的加权和最小”相当于设置一个交货期窗口过早过晚都有惩罚。在确定目标函数时企业最好把“拖期到底赔多少钱”量化成系数。做不到完全量化至少要对不同订单设置不同的权重。我见过一个车间只用一个“按时交付率”指标来考核排产结果系统把所有紧急单都排到最前普通单被挤压拖期交付率虽然保住但整体产出和客户满意度反而下降。这就是目标函数设置单一导致的失衡。4.3 成本与综合目标能耗、换型、瓶颈利用率越来越多的工厂把调度目标从时间类指标扩展到成本与综合指标上。比如在表面处理行业不同颜色涂料间的换色清洗成本极高把相同颜色的工件尽量安排在一起能大幅降低清洗耗材成本和换型时间这时候调度目标就变成“换型次数最小化”叠加“拖期最小化”的加权问题。再比如在铸造行业熔炼炉的能耗和炉次安排密切相关把订单合理分批能减少熔炼炉次直接降低能耗成本。瓶颈设备的利用率也经常被当目标函数。约束理论主张瓶颈资源上的时间损失就是整个系统的产出损失因此调度时应优先保证瓶颈设备的连续加工哪怕由此导致非瓶颈设备上的某些工件多等一会儿。这在单件小批量车间特别实用值得记住。实际的项目里我把多目标处理方式分成两种一种是加权求和把所有目标归一化后乘以权重加总成一个目标值优点是简单缺点是权重难定而且不同目标的量纲差异会带来数值上的偏见另一种是字典序优化法Lexicographic先优化第一优先级目标在保持其不劣化的前提下再优化第二目标。后端系统中我倾向于用字典序因为更容易向车间解释“为什么这么排”先保交付率再压缩换型次数逻辑上更通顺。5. 实际车间选型判断怎么确定我的车间该用哪类模型前面几节把调度问题的分类坐标轴都讲清楚了现在回到最实际的层面作为一个工厂的工程师或者数字化项目经理你走进自己的车间扫了一圈设备、订单和工艺流程怎么快速判断自己应该用哪一类调度模型、用什么级别的算法5.1 一张表看清不同分类的使用场景先给一个速查表方便大家对照判断机器环境特征对应类型典型行业/工序复杂度级别只有一个关键瓶颈设备单机调度注塑机、测试机、热处理炉低到中多台同功能设备每工件只做一道工序并行机调度SMT贴片机群、包装线、CNC群中所有工件按相同路线经过多台机器流水车间调度冲压-焊接-喷涂产线、装配线中到高各工件有不同工艺路线在多设备上流转作业车间调度离散机械加工、模具车间高设备可并行处理加工路线柔性极高柔性作业车间调度柔性制造系统、高混低批量工厂很高工序顺序没有强约束可灵活交叉开放车间调度维修车间、实验室中到高5.2 从生产现场信息反推调度类型的步骤第一步画工艺路线图。取5到10个代表性订单把它们的工序顺序写出来。如果所有订单的工艺路线完全一致落流水车间如果不一致落作业车间如果工序没有明确的先后要求落开放车间。第二步看清楚设备。统计设备数量看有没有高度瓶颈的设备。全厂只有一台关键设备能决定出货量单机问题成立同功能设备多台并行机问题成立设备前后串联并且工序有严格顺序流水或作业车间。第三步统计信息确定性。历史数据里加工时间波动大不大插单频率高不高机器故障率如何波动大、插单频繁、故障率高一定要按动态调度来设计别指望静态的月度计划一次执行到底。第四步问一句“调度到底要优化什么”。接单前你更怕超期还是更怕空机车间库存高不高换型损耗大不大回答完这几个问题在交货期、完工时间、成本三类目标里选一个做主目标其余当次目标。5.3 实操心得先匹配再优化实际上工厂里的真实问题往往很难精确归入某一个教科书类别更多是几个类型的拼接。比如一个车间里有冲压、焊接、喷涂三条连续工序内部各工序存在并行设备这就是柔性流水车间但喷涂环节因为颜色切换存在批次约束需要在模型里专门处理。对这种“混合形态”我的建议是“先匹配主干再处理细节”。先把问题归入最接近的主类别比如柔性流水车间再在细化阶段把特殊约束颜色切换、模具约束、班组约束当作其他约束加进去。一上来就想建立一个大而全的万能模型通常只是拖慢求解速度、增加调试难度现场反而不买账。另外不要一上来就追求最优解。先把可行解做出来让车间能按着计划跑起来再逐步迭代逐步压缩浪费。车间调度不是一场学术竞赛而是一个持续改进的过程。没有可行解再漂亮的算法都是空中楼阁。6. 实操中常见的分类误判与踩坑实录最后这部分我把自己和同行在实际项目中踩过的一些坑集中整理一下希望对大家有帮助。这些坑没有一个来自课本全是现场“交学费”换来的。6.1 把Job Shop当成Flow Shop建模最常见的误判发生在这里。很多车间表面上有一条“产线”摆了几台机器看起来像流水线但仔细看工艺路线就会发现不同订单的工艺路线并不一致甚至存在工序逆流的可能。把这种车间按Flow Shop建模求解是省事了得到的排产计划在车间里却执行不下去因为模型里根本没允许某些订单跳过某道工序。我的经验是接到项目后先做一次工艺路径的聚类分析。如果所有订单的工艺路线相似度很高只是少数工序可以跳过可以用带“可选工序”的Flow Shop变体如果工艺路线五花八门各订单差异很大老老实实按Job Shop来建模。别因为Job Shop难求解就选择无视业务现实建模不正确后续优化全部作废。6.2 用静态模型求解动态问题动态扰动是车间生产的基本属性但很多方案在规划阶段把问题简化成了一个静态问题。等到上线运行系统排出来的计划很快就被一次次插单、设备停机冲散计划沦为一纸空文操作工和计划员不得不重新手工调整。碰到这种场景关键是至少做到两点其一预留产能缓冲区不要让计划的设备利用率逼到100%留出大约10%的余量来吸收扰动其二建立一个明确的“滚动重排”机制比如每个班次结束时基于当前在制品状态、设备状态和最新订单重排下一班次取代一次性算好就再也不改的静态模式。6.3 目标函数选不对优化越努力越偏离在调度系统里目标函数是“指挥棒”。如果企业最关心的是准时交付但系统在默认配置里优化的是设备利用率那排出来的结果是空机率低了但某个关键订单被挤到后面去了交付率反而下降了。系统看起来“很忙”但客户体验更差了。选目标函数的原则先看企业当前的经营焦点是扩张产能、控制成本还是保履约交付。旺季多关注交付指标淡季多关注成本和流动指标。另外目标函数需要和关键绩效指标对应起来。如果KPI里是及时交付率那排产系统应该用加权拖期类目标如果KPI是单件成本那目标里得有换型次数和能耗因素的权重。6.4 小规模场景误用复杂算法最后一个坑正好和前面相反。有些车间规模并不大机器十几台订单二三十个规则算法或简单的启发式就能给出足够好的方案。但项目团队非要上遗传算法、模拟退火理由是“要有高级感”。结果求解时间长、参数难调现场人员根本驾驭不了最后又退回人工排产。我的观点是算法选型和问题规模、目标复杂度必须匹配。一台瓶颈设备加一个EDD规则加人工微调效果很可能吊打一套无人会校准参数的高级算法。先做数学建模用最优解或简单规则跑一个小规模测试看看离目标差多少再考虑要不要升级到更复杂的算法。这样既能控制投入风险也能保证项目落地效果好。最后说一点个人体会。车间调度问题的分类说白了就是在帮你回答三个问题这个车间里最难协调的资源是什么这种协调的最优形式是怎样的生产现场谁最在意这种协调的哪项结果把这三个问题想透无论你之后是选APS软件、自研优化算法还是用Excel搭一套排程表方向都不会跑偏。这也是我为什么一直强调“先分类再求解”的原因。车间调度不是一道孤立的数学题它始终扎根在真实的车间里。
返回列表