科普推广运筹学一直以来是【运筹OR帷幄】平台的初衷。本次我们邀请到了平台优化板块的责编团队的成员,结合各自独特的业界工作体会,分享他们眼中在业界发光发热的运筹学。
一、元器件行业中的运筹学
本人在一家做元器件服务的公司实习,军用元器件使用的时候有两个典型场景:替代和统型。
替代是设计师针对进口元器件找到可替代的国产型号;统型是在一个产品的BOM内确定某几个不同元器件是否可以统一使用一种,以此减少元器件品种数。
目前行业内开始从依赖专家经验(比如知道某个国产元器件就是对标某个进口元器件做的),转向从元器件性能参数的相似度出发进行判断,所以涉及到相似度和聚类方法的应用。
相比方法本身,解决问题的更大阻碍是元器件性能参数数据的复杂性和不规范性。例如不同类别的元器件性能参数不同,即使在同一类别下,不同生厂商给出的性能参数形式也不同,对此进行规范需要有元器件专业知识,所以实际中,数据清洗往往耗费最多人力,也是影响方法使用效果的一大因素。
二、电力行业中的运筹学
本人领域是电力系统最优化,可能大家没有察觉,但是现在中国的电力网络毫无争议的走在了世界的最前沿。强如美国,最近也又一次出现了大规模停电问题。(上次是1977年加州大停电)这次美国的停电持续了25个小时,约至少4万人受到了影响,经济损失至少3000万美金以上。但是中国自从普及用电后,从没发生过如此大规模的停电问题。除了电力人的辛勤奋斗外,这也离不开运筹学在电力系统中的应用。
众所周知,我们现在的电力网是交流输电网络。交流输电网络中的参数远比直流输电网络要复杂得多。最明显的不同,在交流网络中我们需要处理线路的有功功率无功功率。除此之外,线路的损耗、输电节点的电压和相角也是我们需要考虑的因素。为了保证整个电力系统的损耗最小,我们需要建立相关的数学模型进行分析计算,然后再由调度中心进行调控。但是实际问题的复杂程度远远超乎想象,单一个最优潮流问题就是一个大规模非凸非线性的问题。为了求解这类问题,相关学者提出了诸多算法和理论。诸如:半正定规划、现代内点法、凸松弛技术,模型近似技术等。这些理论已经发展了数十年,但即便如此,也没有一套成熟的理论被应用到实际中。
在电力网中,我们不单要考虑线路损耗的降低,更重要的是要保证供电的可靠性。我们常常需要提前一天或数天对电力系统进行调度安排,这类问题往往是一个多层优化问题,对于这类问题,我们常见的求解办法是Benders分解和列生成。除此之外,我们需要不定期对线路检修,发电厂的维护,而线路的通断、发电厂的启停在数学模型中又成了一个整数规划问题。整体的求解难度又上升了一个层次。另外,在国家大规模倡导新能源接入的今天,风电和光伏电站不断被接入电力网络中,而新能源不能得到普及的一个重要因素是我们不能准确预知新能源电厂在下一时刻能够发出多少电能供我们使用。为了分析这类问题,我们的模型在混合整数非线性规划上又需要考虑不确定因素带来的影响。对这类问题的求解,我们又提出了随机规划、鲁棒优化、分布鲁棒等。还有一点,我们的输电线路可能会由于雷击、树枝接触等导致出现输送功率出现扰动。系统中的这些小扰动可能会对用户供电的电压和频率产生波动,对于普通家庭来说可能影响不大,但是对于一些高精技术的产业,一次电压或频率的波动就可能导致整个生产线的崩溃。如何建立相关的数学优化模型来预防这一问题也是当前的研究热点之一。
最后,大家也十分熟知我们国家有一个西电东送的工程,这也是我认为最困难的一个点,我们国家的电力网络是连在一起的,是一个十分庞大且复杂的系统,而我们电力网络是时时波动的,我们需要在秒级做出优化,并给出方案。目前针对这种超大规模的含不确定性的多层混合整数非线性规划问题,我们没有办法在有限的时间内得到一个最优解。
但即便困难重重,在一线的电力工作者仍在尽自己最大的努力来保证电力网络的安全可靠运行,为中国电力点赞。
三、制造业中的运筹学
本人目前是某厂的算法工程师,参与过企业的排班,调度,决策优化等场景的项目,主要想结合自己的经历和大家分享一下运筹优化在企业中的一些应用,主要包括任务规划/排班和实时调度两个方面,围绕场景定义,方法论和实际中的困难三个点进行阐述。
1、任务规划/排班
(1)场景定义
首先说一下什么是任务规划,什么是排班。任务规划是基于设定好的任务输入,进行任务的排期规划,以达到资源的有效利用和工作效率的提升。任务规划主要用于传统制造业/工厂排程,建筑工程规划排程,物流运输线路任务打包等场景。任务规划后输出给虚拟人或者其它虚拟资源创建的带有时间窗的任务包,排班则基于这些任务包,把它对应到实际的人或者其它真实车辆,机械等资源中,规划出某些资源在什么时候做什么任务的结果,以及该任务需要消耗多少其它资源。
(2)方法论
主要的规划方法也是传统运筹优化使用的方法。首先了解真实的业务场景,抽象业务规则和约束,搭建数学模型,运用规划求解器(Cplex,Gurobi等)或者启发式算法(Local Search,Iterative Forward Search等以及各种变种)进行求解。启发式算法可以在现有的solver上进行基于不同场景的二次开发,也可以自行开发。业界一般采用第一种方式。
(3)实际运用困难点
在实际场景中,给不同资源的排班会有很多实际因素要考虑。给人排班要考虑人的工作班次时长,人历史的上班习惯(如习惯上晚班,晚班后不能接早班),人所拥有的技能,个人的偏好(偏好某个工种或者上班时间段),法律规定以及不同工厂因为地域有不同的差异,如香港是8小时工作制,而大陆班次时长可以是10小时等。当我们处理实际问题的时候,先要梳理实际场景,总结管理规律,构建多种配置参数,进行建模。相比于排班来说,任务规划因为是针对虚拟资源而构建,所以可以不用考虑过多的资源属性(如人习惯)等因素。
2、实时调度
(1)场景定义
基于实时数据输入,进行任务的整合和任务的分配。主要的场景有:O2O外卖即时配送,打车软件车辆实时调度,仓储叉车/AGV,分拣中心分拣机器人实时调度等场景。实时调度的场景主要集中于新业务,而非传统的制造业和实体企业。传统的制造业和实体企业骄傲于他们的规划,而前面场景定义所提到的一些新业务场景,无法采用有效地长期规划手段,更多地是依赖短期的预测和实时的规划调度。
(2)方法论
上述提到的短期预测:如外卖下单到餐品完成的时间估计,车辆调度Supply和Demand的平衡,仓储/分拣中心的任务需求预测等,一般基于不同场景搭建机器学习模型,或者各种深度学习模型的Ensemble进行训练和预测。
实时的规划调度包括:如外卖下单后分给哪个外卖小哥,车辆订单来了分给哪辆车,任务需求来了分给哪辆叉车,AGV或者机器人。主要的方法有:
● 短时间压单后进行任务分配,以牺牲一定的最优性而换来快速高效地计算,采用传统并行的多个Tabu Search,Simulated Annealing等进行TSP或者VRP的计算。
● 强化学习/动态规划方法。用收集的数据和规则搭建仿真环境,用强化学习构建任务需求(订单或者生产入库需求等)与资源(车辆,外卖效果,叉车等)的匹配价值(Value),然后分配计算。
(3)实际运用困难点
● 大规模订单/任务需求的计算,需要一定的计算资源支持,以及牺牲算法的优化性来实现快速计算。
● 实时数据的采集。有些数据无法直接有效地采集,比如真实商家做餐时间。
● 如果要搭建仿真环境,也需要了解和抽象实际的业务规则。
3、关于运筹学在业界应用的思考
我在某公司实习了三个月,主要做的是生产计划。生产计划也是属于供应链的一个环节,与调度相比生产计划的制定要更加宏观一些。生产计划就是决策什么时间,在哪家厂/哪条生产线上,加工多少工件。生产计划的问题广泛的存在于制造业中,举个例子就是是手机的制造,一部手机有上千个零件构成,每个零件都在指定的供应商处生产,例如手机屏幕,手机摄像头,手机电池,手机充电器每个零件都由不同的生产厂来生产,然后将这些零件运送到最终的组装厂拼装成一台成品的手机。如何合理的安排每个厂在什么时候该生产多少零件是一个需要决策的重要问题。这个问题的核心在于要考虑尽量满足订单的需求要降低库存水位(或者是库存的周转率),同时要考虑到物料的约束,产能的约束,运输的约束等等因素。
在小规模的排产问题中人工调度员还能应对,一旦生产规模变大,生产工艺复杂之后,人工调度的弊病会逐渐凸显出来。目前国内有意识去做供应链的决策模型与算法的并不多,据我所知其中比较有代表性的是杉数科技。
杉数科技智能计划排程系统致力于为制造业及其上下游产业提供全链条技术服务,利用运筹学与机器学习将实际问题转化为数学模型求解,实现最优化的排程。个人认为,杉数科技在运筹学应用于制造业领域做了很好的探索,在很大程度上解决了如何用更少的人,更短的时间,生产更多的产品问题。
上面提到的生产计划问题本质上是一个混合整数规划问题,零件的个数就是一个整数变量,而生产这些零件的物料可能是整数的也可能是连续变量,因此该问题构成了一个混合整数规划问题。解决方案无非以下两种:
● 采用经典的混合整数规划的方法,先对原混合整数规划进行分解和重新建模,例如拉格朗日松弛,Benders 分解或者列生成等等方法,子问题的求解可以采用Gurobi或Cplex这些商用求解器。
● 针对问题特性设计元启发式算法,启发式算法。
实际运用困难点
我想谈谈混合整数规划在业界应用的gap到底在哪里,当然说大一点的话也是探讨运筹学在业应用的gap。
(1 )实际应用问题往往是大规模的
实际的生产问题往往是大规模的,例如我实习时所面临的实际问题其决策变量维数都达到上亿级别,业务部门要求是2小时之内给出结果,这对算法的效率实际上提出了非常大的挑战。即使是求解上亿规模的线性规划问题耗时都比较巨大,更不用说是整数规划问题了。我们经常说线性规划简单,哈哈,但是从实际应用的角度来看目前求解线性规划的速度在一些场景上还是不能满足我们实际应用的需求的。
目前在学术界大家很多情况下都是在小规模问题上自娱自乐玩一下,所以真正在公司的话,大规模的问题非常非常普遍。举个例子就是读运筹学的PhD的时候是学会在游泳池里游泳,真正在公司里边面对的问题可能就是得在大海里边游。这其实还是比较好的状况,更差的情况是一些童鞋可能在学校里只是学会了在浴缸里游泳而已。
(2) 实际数据往往都是病态的
实际问题的数据往往都是病态的,例如我在公司遇到的问题就是病态问题,具体来说就是优化问题约束或者目标函数的系数数量级的差别过大,导致求解过程的病态,实际问题的数据往往是千差万别和稀奇古怪的,数量级的差异经常超过10E20以上。这一点在学术界研究的相对较少一点,因为学术界研究的问题都比较理想化,即使有从实际中抽象一些原型出来,但是已经把病态啊这些问题都基本过滤掉了,但是在实际中你就发现病态问题太多了。
(3) 业务人员没有优化的意识,运筹优化的人缺乏业务知识,沟通成本非常高
业务人员没有优化的意识,很多时候他们不清楚运筹优化能做什么,甚至当运筹优化的算法工程师问题业务人员你们有什么要求没(约束条件),你们有什么量化的指标要越大越好或者越小越好(目标函数),业务人员很多时候也不能很清晰量化的描述出来这些东西,还有很多时候业务人员嘴巴上告诉你的目标函数和心里想的不一致。就相当于你是一个大厨,什么线性规划,拉格朗日松弛,列生成,半定规划,鲁棒优化这些菜你都会做,结果来一个顾客说他不知道吃点啥。
运筹学的理论的应用必然还是要有一个实际的背景问题,而不同的问题所处的行业不一样,每个行业都有自己的习惯自己的一套语言和模式,例如航空业就有很多专业术语,如果做航空优化的话,那么就要求运筹优化的算法工程师要具备一定的业务基础,否则你是无法和业务人员交流的,人家说话你都听不懂,1次2次不懂你可以问,十次八次不懂的话,人家就不爱和你说话了。而且运筹优化算法工程师一般都是作为乙方出现的,很多时候还必须是我们得放低姿态的去主动的接触业务学习业务才行啊,否则项目就很难进行下去。
(4) 测试困难,如何验证优化算法求解结果的正确性
好不容易,经过了重重阻碍,克服千难万险,我们的优化算法出炉了,我们可以得到一个结果。如何验证这个结果是正确的呢?其实非常抱歉的告诉你,基本没啥靠谱的方法去验证。现在在公司普遍的作法是两种,1是人为的构造一些类似benchmark的东西,这些东西的最优解比较显而易见,通过这些benchmark来检测算法的正确性;2是参考以前人工的经验来看,算法给出的解是不是合理,例如要是做一个调度算法呢,就找几个有经验的调度员来看这个算法是不是接近以前人工调度的结果,如果接近那就认为OK了。很显然这两种方法有很多的不足,第一种方法只能适用问题特别简单的时候,问题稍微复杂一点,规模大点benchmark就很难构造了,第二种方法虽然适用面更宽一些,但是问题也很明显,那就是以前人工调度的结果很难说是比较好的结果,那这个结果去和算法做对比本来参考系就有问题。
四、电商行业中的运筹学
本人目前在某电商供应链计划部门实习,该电商平台有八个事业部,每个事业部每天都有一定量级的产品上新、下架。目前平台上八大事业部的总商品数量量级是十万,对接不到2000家供应商。我所在职位的主要工作内容是,根据历史销量进行各个产品的需求量预测,由于产品发货渠道有商家自发货和平台发货两种渠道,选择平台发货的厂商需要结合产品的生产周期,并且按照与平台约定的补货周期将货物运到平台的自有仓库。
因此对于平台供应链计划部门来说,需要根据货物现有库存,结合日均销量预测(分大促日销和平常日销两种)实现补货量和补货时间点预测自动化,仓库效益最大化。将预测信息反馈到计划员和事业部同事进行产品调整。存在的难题有很多,比如对于新品的日销需求预测?长期在架产品的需求预测及库存管理实现效益最大化?当某产品的补货周期是一个月时,涵盖了大促时期和平销时期,如何库存管理和日销量预测,以实现仓库效益最大化,平台收益最大,且尽可能缩短断货时长?而这些都是运筹学和优化问题。
五、机器学习行业中的运筹学
本人最近在BAT(之一)的北美研究院实习,研究院本身的运作模式算是和本地业务团队稍有不同,成员多为国内外名校毕业的计算机、统计、数学、运筹学等专业的博士。除了写paper之外,团队也需要做能“落地”的业务支持项目(通常和国内的业务部门合作):如在线视频网站的推荐算法、二手商品平台的定价算法、新零售门店的多渠道库存控制算法等。
这些问题首先的一个共性是:海量的数据规模。这些问题对应的业务部门都有专门的数据团队,每天在公司内部的数据仓库会定时更新当日的数据(每日的数据量级都是上百TB)。因此,要在此基础之上,设计实用的优化算法,实际上对经典的运筹学模型和优化算法来说,也是巨大的挑战。
因此,在目前我注意到的这些业界的实际“优化”业务中,机器学习方法和运筹学模型基本上是要一起使用的。更具体的来说,业界更需要的是“数据驱动”的决策模型。比如,现有的机器学习、深度学习方法带给我们良好的预测模型,而所谓的决策模型/优化模型便往往可以基于这些预测模型之上。当然,最理想的状态是能够将预测和决策这两个看似分离的步骤结合起来,即,动态地基于预测调整决策,再通过现阶段的决策调整之后的预测。关于这点,目前学术界有了很多不错的理论,但距离工业界的实际“落地”还是有距离的。这或许便是业界当中机器学习和运筹学的未来吧。