排产中的两种对立策略 - 负载均衡与成本最优

news2024/10/7 4:31:25

        在APS系统设计中,根据不同的业务场景,会出现两种截然相反的策略需求,分别是(资源)负载均衡成本最优(最低),两种策略分别适用于不同的业务场景。本文我们将这两种策略的适用场景、方案原理作初步探讨,并就这些策略在OptaPlanner中的实现思路稍作分析。事实上,这两种策略不仅仅在APS自动生成生产计划的逻辑中存在,在较高层次的主生产计划(MPS)、对具体设备加工机台的实时生产调度指挥模块,乃至物流运输中的VRP(车辆路径规划)场景中,均会出现,基本原理下实现方式则大同小异。

业务场景

        在定制生产计划过程中,对计划的要求,除了需要符合一些“硬性要求”外,还会针对一个或多个特定目标尽可能迫近。其中硬性要求部分将在本文最后的【硬约束与软约束】小节中详述。对于特定目标,可以理解为制定计划的最终要求,也是一个生产计划优劣的关键所在,我们称之为排程策略。

        在某些行业中生产旺季出现订单需求大于产能时,订单的准交率是一个重要的KPI,在这种情况下,实现订单的准时交付比节约成本来得更重要,此时制定计划过程中生产加工的作业效率优先是一个关键要求,在确保优先使用高效率设备的前提下,各设备的任务安排尽可能均衡,从而更大程度上提升设备利用率,缩短任务的加工周期,从而减少订单延误、提高准交率。此时使用APS进行自动计划时,设定资源均衡策略,能很好地实现这一目标。

        相反,当行业处于淡季时订单量减少,交付压力也随之减少。在确保订单不延误的前提下,降低成本则成了首要目标。在定制计划过程中,尽可能使用低成本资源,则是降本的其中一个重要手段。例如尽可能使用低成本的机台、低时薪的人员,尽可能使用少的设备完成指定作业任务等。此时,使用APS系统时,通过选择成本优先策略,能在确保符合其它要求(例如工艺、质量要求)要求的前提下,尽可能降低成本。

两种策略的实现原理

环境条件

        假设有以下任务要求与可用设备,见下表:

图片

        即简化后的规划数据集(待排数量)中存在以下信息:

  1. 存在2台设备,设备1每天开机运行成本是1(即单位成本是1),设备2每天的运行成本是2.

  2. 存在4个任务,其中任务1、任务2、任务4的加工时长是4天任务3的加工时长是6天;所有任务的交期均为第12天(以第1天的基准进行排程)。

方案1:资源负载均衡策略

        若使用资源负载均衡策略,将会得出以下方案,其目标是所有设备获得的任务天数应该尽可能均等。通过下图可以观察到,设备2比设备1工作天数多2天。这种情况下所有设备的利用率是最高的,即所有设备尽可能并行开机,加快整体作业效率.

图片

        从方案的交付效率来看,最后一个任务(任务4)是第10天完成,距离交期仍有2天盈余。但成本(资源的占用成本)并非最优,该方案的资源成本(即设备成本)为28,分解计算如下:

  • 设备1(单位成本为1),任务1(4天 * 1) + 任务1(4天 * 1) = 8

  • 设备2(单位成本为2),任务3(6天 * 2) + 任务4(4天 * 2) = 20

  • 得出所有任务对设备的占用成本为28.

小结:当使用资源负载均衡策略时,会得到一个各设备的任务分配尽可能平衡的方案,这种方案表现为资源利用率最高,但成本并不一定最优.

当处于生产旺季,因为订单多且复杂,对准交率要求高时,可以使用负载均衡策略。

方案2:资源成本优先策略

        若将系统的排程策略设定为成本优先,引擎会在分配资源的任务时,遂行与方案1截然相反的策略偏好。如下两图(方案A与方案B),按该策略获得的方案中,为了降低设备使用成本,而在一定程度上放弃部分准交率。尽管基于降本策略,引擎仍会针对准交要求,作出限制范围内的优化。其中可能产生以下两个方案,引擎会基于准交要求,更智能地选择方案B.

图片

        基于成本最优策略,有可能排出一个如上图的方案A. 该方案各项指标如下:

  • 设备成本为18: 各任务均分布在设备1(4天 + 4天 + 6天 + 4天) * 1 = 18.

    任务总延期天数为8天: 其中任务3延期2天(14-12), 任务4延期6天(18-12),共延误8天。

    订单延误总数为2任务3任务4同均延误。

        该方案显然比较“鲁莽”,引擎会继续寻找更佳方案,有可能会找到满足成本最优要求,但准交率更佳的方案,如下图的方案B。

图片

        同样基于成本最优策略,引擎将尽可能找出如上图的方案B.该方案的各项指标如下:

  • 设备成本为18: (4天 + 4天 + 6天 + 4天) * 1 = 18.

  • 任务总延期天数为6天:任务4延期6天(18-12).

  • 延误任务数为1: 仅任务4延误。

        当处于生产淡季,成本控制作为重要KPI,且容许一定程度的延误,或生产延误的时间可通过其它环节(例如仓储与物流运输)节省回来时。可以设定为成本最优策略。成本最优策略执行过程中,引擎仍会基于其它指标,例如延误天数、延误订单数等进行优化,从而获得一个相对最优的成本优化计划方案。

小结:在确保成本最优(可牺牲交期)的策略设定下,将会出现一定程度的延误,但引擎仍会尽最大可能减少延误程度。而对于延误订单数与延误天数,则又可拆分出更多不同的诉求,进一步影响引擎的决策行为,本文不再展开。

方案3:保证交期的前提下执行成本优先策略

        当我们处于保证交期不延误作为硬指标的要求场景下,可以基于“除非资源不足,否交期不得延误”的前提,生成一个成本最优方案,如下图

图片

对于上图中避免延误的成本最优策略获得的方案,该方案的各项指标如下:

  • 设备成本为24:设备1,(4天 * 3) * 1 = 12; 设备2,6天 * 2 = 12, 总成本为24.

  • 延期天数与延误订单数均为0.

小结:在保证订单不延误的前提下,引擎可以寻找到一个满足条件,且占用资源尽可能少的方案。当数据集更大,反映的情况更复杂的情况下,人为排产将面临巨大挑战,大部分情况在,需要考虑的复杂远超人力可顾及的水平。

方案4:综合均衡与成本两种策略(需要去除量纲)

        除了上述将资源成本与均衡分开考虑的情况,在实际排产工作中我们还会遇到对成本与均衡两个要求综合考虑的情况,这种情况将更为复杂。例如:“当延误小于一定的程度(例如延误天数、或延误订单量小于某个阈值)时,仅使用低成本设备。”,“每延误1天算作1分,某台设备成本10分,因此延误10天以下,不启用该设备”。

        诸如此类情况,实际上是对于不同的因素作加权计算结合考虑,从而实现去除不同因素的量纲(例如延误按天算,机台成本按货币算等),形成一个可横向对比的系数。这种情况我们在设定优化策略时,可以将需要考虑的因素集合,通过一个数学模型进行去量纲化,从而实现引擎以计算后的系数为基础进行方案评分。

        由于情况过于复杂,本文不列举示例。通过易排平台的规划策略设定,可以实现该需求;但众多项目实践证明,需要将不同的因素综合在一起形成系数,需要大量的数据验证,否则得到的转化模型很难考虑周全。此外,通过这种系数评分体系得到的方案,在验证方面也是巨大的挑战,也就是面对引擎排出来的方案,当你需要验证它是否符合指定的策略意图时,也相当复杂。

硬约束与软约束

        上文提到的规划模型中的某些不可违反的“前提条件”,是指我们业务约束中必须符合的要求的集合,我们称之为硬约束。在规划模型中通常用subject to部分表示(称为“受限于”),例如我在一篇介绍Google - OR-Tools的文章中提到基于OR-Tools建立的简单数学模型示例中,s.t.部分,如下图红框部分(该文章尚未发表在本公众号,可到知乎等平台上搜索《OptaPlanner与Google OR-Tools的区别》)。

        相对于硬约束,还有部分约束被设计成软约束,以数学规划模型来看,就是目标函数,即下图绿框部分。

        求解器(即规划引擎)在求解时,基于subject to部分为前提,求目标函数z取得极值时,各个规划变量的值,即下图的x, y的值.

图片

        在OptaPlanner中,subject to部分使用硬约束实现,而目标函数则使用软约束来实现。事实上当业务场景相当复杂时,形成的数学模型也将会相当复杂。但OptaPlanner中的规划模型无需建立数学模型,也即无需将业务约束通过数学表达式表示出来,只需通过Java的各种类反映各业务实体,再通过约束表达式(以前使用Drools脚本,现在使用ConstraintStream来表达,也可以直接通过Java代码来表示)实现硬约束与软约束。

        在OptaPlanner中,生成的所有备选方案中,若一个方案违反了硬约束(即数学模型中的subject to),则被称为不可行方案,否则称为可行方案。例如,“任务A只能使用A类设备加工”被定义为个硬约束,当一个方案中它被分配到其它A类以外的设备上加工时,即违反了硬约束,这个方案被称为不可行方案

        而一些约束可以被违反,即使违反了这类约束的方案,仍然是可行方案;但不违反比违反更佳违反得少比违反得多更佳。这类约束我们称为软约束。上述的资源负责均衡、资源最优策略,明显属于这类软性要求,因此,在OptaPlanner/TimeFold中通过软约束实现。

        例如,成本最优中,通过资源被占用天数乘以单位时间成本作为方案成本,作为成本最优这个约束的计划公式。引擎在对各个方案评分过程中,就会按此公式进行计算,去寻找成本最低的方案。评分函数可表达如下

图片

其中,ci表示第i个设备的单位时间使用成本,xi表示第i个设备每个月占用天数。

        实际排产场景中,上述提出的各种优化策略单独存在,只是最理想的情况,实际排产中,除了资源成本(或任务均衡)这一个软约束,我们还需要考虑更多其它制约因素,从而形成一个复杂的多目标优化问题。需要将这些目标综合在一起,根据实际业务情况理清各自的层次与权重,才能建立高质量的规划模型。

易排平台台的策略选择

        在易排平台上,我们开放了一个规划策略选择,可以基于您的选择来指令引擎遂行相应的策略。这个功能我们将在1.5.1版本推出。

图片

<完>


我们的易排平台就是基于OptaPlanner求解器做的一个一定程序上对Job Shop Scheduling场景的泛化,可以最大程度上适配各种复杂的生产计划和车间调度情况。需进一步了解,可以关注公从号【让APS成为可能】获取更详细资料,或添加本人微信 13631823503详细探讨。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1004949.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot项目--电脑商城【确认订单】

1.持久层[Mapper] 1.1规划需要执行的SQL语句 用户在购物车列表页中通过随机勾选相关的商品,在点击"结算"按钮后跳转到"确认订单页",在这个页面中需要展示用户在上个页面所勾选的"购物车列表页"中对应的数据.说白了也就是列表展示,且展示的内容还…

solidworks底部状态栏显示不出来

如下图所示&#xff0c;solidworks主界面下面的状态栏突然不见了。 怎么调出来&#xff1f; 第一步&#xff1a;点击视图菜单&#xff0c;用户界面&#xff0c;把状态栏前的勾勾上。 第二步&#xff1a;把视图下面的触摸模式关掉&#xff0c;这一点很容易被大家忽略。

代码随想录--哈希--两个数组的交集

题意&#xff1a;给定两个数组&#xff0c;编写一个函数来计算它们的交集。 说明&#xff1a; 输出结果中的每个元素一定是唯一的。 我们可以不考虑输出结果的顺序。 import java.util.ArrayList; import java.util.HashMap; import java.util.List;public class SSS {public …

织密安全防线——记建行江门市分行推进反洗钱工作

建行广东省江门市分行多层次织密反洗钱防线&#xff0c;持续护航高质量发展。 健全架构 建行江门分行成立以“一把手”为组长的反洗钱工作领导小组。通过在部门、支行、网点层面分别设置反洗钱合规官、合规专员、情报专员、合规员等岗位&#xff0c;层层织密反洗钱防线。持续加…

【C++】构造函数意义 ( 构造函数显式调用与隐式调用 | 构造函数替代方案 - 初始化函数 | 初始化函数缺陷 | 默认构造函数 )

文章目录 一、构造函数意义1、类的构造函数2、构造函数显式调用与隐式调用3、构造函数替代方案 - 初始化函数4、初始化函数缺陷5、默认构造函数6、代码示例 - 初始化函数无法及时调用 一、构造函数意义 1、类的构造函数 C 提供的 构造函数 和 析构函数 作为 类实例对象的 初始化…

【性能测试】Jmeter插件之ServerAgent服务器性能监控工具的安装和使用

文章目录 安装插件安装ServerAgent 安装插件 1、在Jmeter官网&#xff1a;https://jmeter-plugins.org/wiki/PluginsManager/ 下载插件管理器Plugins-manager.jar 2、将JAR包放入到lib\ext目录下 3、重启Jmeter&#xff0c;可以在选项下看到Plugins Manager选项 4、安装…

解决golang无法下载依赖的奇葩问题

最近刚开始学习go&#xff0c;看了几个开源项目&#xff0c;遂下载好朋友的go开源项目&#xff0c;想着coding first&#xff0c;我得先跑起来&#xff0c;结果居然卡在依赖上。就像下图&#xff1a; 真的是头疼&#xff0c;反复执行 go mod tidy&#xff0c;发现本地库中也能下…

vue三个点…运算符时报错 Syntax Error: Unexpected token

出现以下问题报错&#xff1a; 解决&#xff1a; 在项目根目录新建一个名为.babelrc的文件 {"presets": ["stage-2"] }

分享一个基于微信小程序开发的高校学生毕业设计选题小程序的源码 lw 调试

&#x1f495;&#x1f495;作者&#xff1a;计算机源码社 &#x1f495;&#x1f495;个人简介&#xff1a;本人七年开发经验&#xff0c;擅长Java、Python、PHP、.NET、微信小程序、爬虫、大数据等&#xff0c;大家有这一块的问题可以一起交流&#xff01; &#x1f495;&…

pyechart练习三:黑色星期五用户画像

一、概述 数据集: 537577行 12列。 二、可视化 1、年龄/性别的各自用户占比 import pandas as pd from pyecharts.charts import Pie, Bar, Grid, Page, Boxplot import pyecharts.options as opts df pd.read_csv(./BlackFridaySales.csv) age_data df[Age].value_count…

简单介绍神经网络中不同优化器的数学原理及使用特性【含规律总结】

当涉及到优化器时&#xff0c;我们通常是在解决一个参数优化问题&#xff0c;也就是寻找能够使损失函数最小化的一组参数。当我们在无脑用adam时&#xff0c;有没有斟酌过用这个是否合适&#xff0c;或者说凭经验能够有目的性换用不同的优化器&#xff1f;是否用其他的优化器可…

41 个下载免费 3D 模型的最佳网站

推荐&#xff1a;使用 NSDT场景编辑器 快速搭建3D应用场景 1. Pikbest Pikbest是一个设计资源平台&#xff0c;提供超过3万件创意艺术品。您可以在Pikbest上找到设计模板&#xff0c;演示幻灯片&#xff0c;视频和音乐等。您可以找到不同的3D模型&#xff0c;例如婚礼装饰&…

Anaconda彻底卸载及重安装

一、彻底卸载Anaconda 1.1 先采用anaconda-clean包初步卸载 总体卸载思路&#xff1a;通过下载anaconda-clean包完成初步卸载&#xff0c;但由于在base下若下载anaconda-clean包会一直卡在Solving environment:阶段&#xff0c;因此首先要创建一个虚拟环境。具体步骤如下&…

freeRTOS系列教程之freeRTOS入门与工程实践【文档+视频教程+进阶视频教程】

《freeRTOS入门与工程实践》 前言课程内容授课方式 学前知识普及学前准备硬件准备资料准备 视频教程文档教程更好的阅读体验 前言 课程内容 嵌入式软件工程师的学习路线一般是&#xff1a;单片机->RTOS->Linux。当你掌握单片机开发后&#xff0c;如果要进一步提升编程水…

质数,思维,prime game

Prime Game - Gym 101981J - Virtual Judge (vjudge.net) Problem - 1520 (nefu.edu.cn) 解析&#xff1a; 这道题还是要考虑数的贡献 题解参考至&#xff08;【ACM-ICPC 2018 南京现场赛 】 J.Prime Game ---- 思维素数筛_WangMeow的博客-CSDN博客&#xff09; 第一个元素的…

Windows下使用Nginx反向代理访问MySQL数据库

安装Nginx 《Windows下安装Nginx》 配置13306端口访问3306端口的MySQL数据库 worker_processes 1;events {worker_connections 1024; }stream {upstream mysql {hash $remote_addr consistent;server 127.0.0.1:3306;# MySQL数据库集群#server 192.168.1.111:3306;}server…

领域驱动设计:DDD设计微服务代码模型

文章目录 DDD 分层架构微服务代码模型 只有建立了标准的微服务代码模型和代码规范后&#xff0c;我们才可以将领域对象所对应的代码对象放在合适的软件包的目录结构中。标准的代码模型可以让项目团队成员更好地理解代码&#xff0c;根据代码规范实现团队协作&#xff1b;还可以…

Linux下的编译器使用以及各个阶段的执行

程序的翻译 程序在形成可执行程序之前都经历过一系列十分复杂的过程&#xff0c;也就是我们程序的翻译&#xff0c;程序的翻译经过以下阶段&#xff1a; 预处理&#xff08;进行宏替换) 编译&#xff08;生成汇编) 汇编&#xff08;生成机器可识别代码&#xff09; 连接&#…

Linux--进程间通讯--FIFO(open打开)

1. 什么是FIFO FIFO命名管道&#xff0c;也叫有名管道&#xff0c;来区分管道pipe。管道pipe只能用于有血缘关系的进程间通信&#xff0c;但通过FIFO可以实现不相关的进程之间交换数据。FIFO是Linux基础文件类型中的一种&#xff0c;但是FIFO文件在磁盘上没有数据块&#xff0c…

快递查询、导出表格,批量操作效率更高

当我们需要查询多个快递的状态时&#xff0c;通常会感到繁琐和耗时。然而&#xff0c;现在有一种快捷的方法可以帮助我们快速批量查询快递&#xff0c;而且还可以将查询结果导出成表格&#xff0c;轻松搞定&#xff01; 首先&#xff0c;在浏览器中搜索“固乔科技”&#xff0c…