作者都是各自领域经过审查的专家,并撰写他们有经验的主题. 我们所有的内容都经过同行评审,并由同一领域的Toptal专家验证.
迈克尔霍普夫的头像

迈克尔霍普夫

Michael是一名开发者, 数据科学顾问, 并擅长为铁路重工业客户提供供应链优化服务, 船只, 和矿业. 他拥有数学优化博士学位,是麦肯锡分析实践的顾问 & 公司的QuantumBlack工作了四年.

专业知识

以前在

麦肯锡 & 公司
分享

建立高效的供应链是2020年最大的挑战之一,这不仅仅是因为COVID-19大流行带来的中断. 供应链是 紧张 在大流行之前,由于全球劳动力和设备的瓶颈和短缺. 以满足需求, 市场参与者必须通过数字化和智能规划迅速实现业务流程的现代化.

我的职业是开发人员 数据科学顾问 专注于重工业:铁路、采矿、石油和天然气、航运和邮政物流. 在过去的几年里,所有这些行业都受到了供应链问题的极大影响. 在这篇文章中,我将探讨如何 数学优化建模Python 能否解决采矿业面临的核心挑战:满足定制需求,实现利润最大化 产品混合.

现代供应链的优化方法

在典型的供应链场景中,供应商向客户交付特定的成品. 在我们的例子中,要做到这一点,供应商必须:

  1. 从多个源位置收集必要的组件(例如.g.、生产场地、仓库).
  2. 将组件组合起来,执行一个特定的程序来创建成品. 在采矿供应链中,这被称为 产品混合.
  3. 将成品交付到单一目标地点(如.g.,客户网站).

做得正确, 产品混合使供应商能够利用客户需求和供应链之间的权衡来实现价值最大化. 数学优化建模是解决产品混合与物流挑战(如调度)相结合的理想解决方案, 规划, 包装, 和路由.

图论方法,比如 网络流程优化,能够有效应对具有明确限制范围的挑战(例如.g.比如询问谷歌地图如何从A地到达B地)。. 但要处理影响供应链重叠方面的更复杂的挑战(例如.g.(产品混合); 混合整数规划 是一个强大的框架. 快, 的研究, ,建立了, 混合整数规划允许用户解决绝大多数调度问题, 规划, 以及路由问题.

为了建模和解决供应链问题,我建议使用Python及其 开源 库,因为它们强大的优化社区.

采矿供应链中的产品调配

作为产品混合的一个例子, 让我们考虑一个采矿供应链,它由几个矿山组成,并生产各种原材料组件. 通常,这些组件必须路由到海港. 为了使我们的示例保持简单, 我们将通过铁路网连接到一个海港,铁路网也将连接到矿山.

我们将使用以下术语:

组件

组件是一个原始的生产项目(例如.g.(一种铜或铁矿石),产自特定地点.

产品

产品是成品, 由客户要求和定义, 通常含有多种成分的混合物,并在规定的质量范围内.

混合

混合是将各种成分组合在一起形成产品, 要么在目标位置(通常是, (客户的船只)或供应链中的某个点.

规范分析

规格或规格分析是对组分属性(如.g.,水分含量). 通常, 工程师进行大约20到100次分析, 每一种测试都测试了原材料的不同特性.

从矿山回收的原材料部件通过铁路运输到港口, 以客户船为最终目的地. 视指定港口靠泊时间表或其他情况而定, 可能需要在库存中临时存储组件. 在港口, 列车要么将货物存放到库存上,要么将货物直接卸载到客户的船只上(我们称之为货轮) 直接命中).

部件储存在矿井和海港. 矿山通常建在储存空间便宜且充足的偏远地区. 港口, 另一方面, 存在于通常空间有限的工业区, 提高港口库存的使用成本.

建模的细节

我们假设的客户要求由不同成分组成的产品混合物. 这些混合物必须符合客户定义的相关矿物属性标准(例如.g., 企业社会责任 值). 来说明这个模型是如何建立的, 假设我们有三个矿,生产七种成分, 如下:

我的一个

生产成分A1 A2 A3.

我的B

产生组分B1 B2.

我的C

生产组分C1, C4.

组件名称中的字母表示该组件的源矿(source mine).g.(组件A3来自矿山A). 让我们同意共享一个数字的组件是相似的, 我们可以同等对待它们:例如, A1, B1, 和C1本质上是同一种原料.

屏幕左侧是矿山A,库存有A1、A2和A3类型的原材料. A矿下面是B矿,储存的是B1和B2类原材料. B矿下面是C矿,储存着C1和C4类型的原材料. 屏幕右侧是一艘载着两堆原材料的船. 船的下面是四个港口仓库, 如下: A stockpile with one heap of raw material labeled A3; a stockpile with three heaps of raw material labeled A2, B2, 和C1, 分别; a stockpile with two heaps of raw material labeled B1 和 A1, 分别; 和 a stockpile with two heaps of raw material labeled A3 和 C4, 分别. 屏幕中央是两列火车. 第一列火车显示为三节车厢,其中两节车厢装满了原材料. 火车下面有两个指向右边的绿色箭头. 箭头之间的文字是“列车已满,驶往港口。.在这列火车下面是一条标有“或”的分界线.在分界线下面,第二列火车显示为三节车厢,所有车厢都是空的. 列车下方有两个指向左边的红色箭头. 箭头之间的文字是“火车从港口返回时是空的”."
例:采矿业产品混合供应链模型

所有部件都通过铁路运输到港口, 在那里我们可以直接打击或者把每个部件都储存在合适的仓库里. 空间限制可能会禁止我们单独存储组件. 像这样, 混合产品时, 我们可能无法单独获得每一个组件,可能需要同时从一个库存中提取多个组件.

现在,让我们讨论一下客户对其产品通常要求的混合规则.

产品混合规则

客户通常会根据客户特定的规则要求混合成分,包括如何进行混合以及需要进行哪些规格分析. 这些规则分为两类, 组件混合规则规格混合规则.

描述

例子

组件混合规则

组成产品的每种成分的比例被定义为整体的比例或百分比.

产品库存(又称混合库存),分类如下:

组件A2

≥ 50%

产品总吨位的50%或以上来自组件 A2.

组件C1

≤ 20%

产品总吨位的20%或以下来自组件 C1.

C1 B2的任意组合

≤ 50%

产品总吨位的50%或更少来自组件的组合 C1 和/或 B2.

规格混合规则

产品的值边界是为每个已定义的产品属性建立的.

产品性能通过规格分析测定. 值包括:

  • 可接受的. 该产品被客户接受,因为它的测定值落在客户的首选范围内.
  • 处罚. 产品被客户接受,但供应商向客户支付了质量罚款,因为产品的测定值超出了客户的首选范围.
  • 不可接受的. 该产品不被客户接受,因为它的测定值偏离客户的首选范围太远.

如果满足以下条件,我们可以接受我们前面例子中的产品:

水分含量

≤ 10%

产品含水率小于或等于10%.

财产𝝰(e).g.渣)

≤ 0.1%

产品中𝝰含量所占比例小于等于0.1%.

财产𝛃(e).g.(化学反应关系)

≤ 35%

产品中𝛃含量的比例小于等于35%.

请注意,, 通常, 偏差惩罚量随边界违犯的增加呈线性函数增加:

描绘三个值的图形. Y轴在图的底部显示一个美元符号,在图的顶部显示三个美元符号. Y轴的顶部是一个向上的箭头. X轴包括五个标签:不可接受,惩罚,可接受,惩罚和不可接受.
规格混合规则值边界的通用建模框架:供应商偏离既定产品属性值的惩罚与偏离程度成线性关系.

混合的优化包括在接受规格混合的惩罚和组件的可用性之间进行权衡.

抽取的数学建模

在创建产品混合模型时,我们必须在不同的提取类型之间进行选择. 对于混合, 平均提取 最常见的拔牙类型是什么. 在平均提取中, 我们的模型基于一个假设,即库存中的所有成分都完全混合在一起. 分层开采,其中我们使用a进行建模 以后,出 规则,是使用平均提取的另一种选择:

平均提取

  • 所有成分完全混合在一起.
  • 从库存中提取一定数量不会影响相对成分比率.

分层开采

  • 组件是分层的,而不是混合的.
  • 提取是从库存的顶部进行的.
  • 在库存顶部的组件被提取出来之后, 直接存储在它下面的组件将被显示并提取. 这种模式不断重复,直到我们到达库存的底部.

分层提取的想法可能很吸引人, 因为它紧密地模拟了大多数库存的存储物流的现实. 然而, 从数学建模的角度来看, 由于计算的原因,平均提取是首选的. 业务专业人员和工程师应该仔细评估使用分层提取的决定,以避免在建模方法中引入不必要的复杂性.

当使用平均提取时, 萃取组分的比例与未萃取组分的比例相同. 例如, 平均萃取是指从储备X中提取的含有75%成分A3和25%成分C4的萃取物,其整体成分和比例与储备X相同.

左边是一个港口库存,标有 &“港口库存." The first (top) of the stockpile’s two layers is labeled A3 和 an indicative label states it comprises 75% of the stockpile. 储备的两层中的第二层(底部)被标记为C4,指示性标签表明它占储备的25%. 库存的右边是一个箭头,指向比例 &“A3 / C4.”
平均萃取举例:萃取成分的比例与库存中未萃取成分的比例相同.

当使用分层提取时, 所提取的成分之间的比例很少, 如果有, 与未提取的成分相同. 分层提取法表明, 例如, 从X储备中提取的物资不一定全部包含与X储备相同的成分, 和储备X的比例不一样. 这是因为我们将提取存储库顶部的任何组件(last-in), 出).

A3库存堆积在C4库存之上的港口库存. 储备中有四支箭. 它们从上到下依次指向标签A3、A3(还是)、A3/C4和C4.
分层提取示例:提取的成分之间的比例很少与库存中未提取的成分的比例相同.

分层抽取的不一致性使得对加载变量建模变得困难. 因此, 平均提取, 这样可以避免加载变量之间复杂的相互依赖关系, 当分层提取不是业务需求时,是首选选项(另见“编码解决产品混合”).

产品混合建模

让我们考虑平均提取的情况. 假设我们想要监控和建模存放在库存或客户容器中的组件. 以下是三种可能的提取和建模场景:

场景1:单一提取建模

我们可以提取任何/所有组件,而不考虑类型.

在这个例子中, 我们可以将组件A1(来自矿山A)和B1(来自矿山B)视为相同的组件,因为它们足够相似.

左上角是一个标有“组件A1”的右箭头.在这个箭头下面是第二个标有“组件B1”的右箭头.两个箭头都指向标有“港口库存1”的库存.在Port Stockpile 1的右侧是一个右箭头,标记为“单次提取”.再往右一点是一艘满载货物的船,上面标着“船只”."

场景2:产品混合提取建模

我们可以提取出一种可行的产品混合物.

在这个例子中, 提取的产品共混物符合客户的产品共混规则要求:

  • 组分A2的比值, B2, 和C1在港口库存2遵守客户的组件混合规则.
  • 此外,组件的规格分析符合客户的规格混合规则.

左上角是一个标有“组件A2”的右箭头.在这个箭头下面是第二个标有“组件B2”的右箭头.在这个箭头下面是第三个标有“组件C1”的右箭头.三个箭头都指向标有“港口库存2(产品库存)”的库存。.在2号港口库存的右侧是一个标有“产品组合提取”的右箭头.再往右一点是一艘满载货物的船,上面标着“船”."

场景3:灵活的混合提取建模

我们只能提取不符合客户组件混合规则的无效组件组合,因此不能单独形成产品.

在本例中,由于A3和C4组分的混合物不能形成有效产品,我们可以:

  • 等待的到来,并结合必要的组件.
  • 将混合物与其他库存混合.
  • 将混合料直接装载到客户容器上,以便与另一种混合料组合.
左上角是一个标有“组件A3”的右箭头.在这个箭头下面是第二个标有“组件C4”的右箭头.两个箭头都指向标有“港口库存3(灵活库存)”的库存。.在Port Stockpile 3的右侧是一个右箭头,标示着“等待倾倒更多组件”,下面是一个流动的沙漏的图像. 在这个箭头下面是第二个右箭头,标记为“与其他库存进行洗牌”,下面是一个库存的图片. 在这个箭头下面是第三个标有“直接添加到容器上的产品混合物中”的右箭头,后面跟着一艘船的图像.

从建模的角度来看, 我建议创建混合整数规划公式来解决产品混合问题. 我们可以只用实值变量和线性约束对产品混合进行建模, 使计算和监测混合物相对容易.

当产品混合建模与需要二元变量进行建模的调度决策重叠时,事情会变得复杂, 比如决定船只靠泊或火车时刻表.

编码解决产品混合

Python是编码和求解混合整数编程公式的理想工具. 使用 纸浆 图书馆制定供应链问题, 比如定义变量, 约束, 目标函数. 方便的是,纸浆的语法非常类似于一个简洁的数学公式.

然后,您可以集成一个开源求解器,如 加拿大广播公司 或者,如果你的预算允许,一个商业求解器 Gurobi or 最大化策略. 与加拿大广播公司相比,商业选项提供了巨大的性能提升.

下面的伪代码示例演示了如何定义加载变量和约束. 加载变量为:

载荷[v=容器,p=港口,c=部件,prd=产品,t=时间]

这些变量有五个指标:船舶、港口、部件、产品和时间. 在实践中,您将定义更多类型的加载变量.

向加载变量添加产品索引对于跟踪指定组件的特定产品非常有用. 因为加载变量是实数(而不是整数), 它们不会对计算构成很大的挑战. 组件混合规则 现在可以建模如下:

load[v, p, A2, prd, t] >= 0.5 * sum(load[v, p, c, prd, t],用于容器v的产品prd的所有c)
load[v, p, C1, prd, t] <= 0.2 * sum(为容器v的产品prd服务的所有c的load[v, p, c, prd, t])
load[v, p, C1, prd, t] + load[v, p, B2, prd, t] <= 0.5 * sum(load[v, p, c, prd, t],用于容器v的产品prd的所有c)

规格混合规则 可以用类似的线性方法实现吗. 然而, 这些约束条件会稍微复杂一些, 因为规格分析通常是按负载量标准化的. 虽然执行起来更简单, 直接建模会引入非线性和, 因此, 不切实际. 而不是, 最好先计算加权伪化验值,然后重新应用线性方程. 注意:约束可能与二进制调度变量重叠,但这超出了本文的讨论范围.

我衷心建议将混合规则合并到供应链模型中. 我过去的客户在优化客户特定混合方面取得了一致的成功, 这仅仅增加了调度模型的计算复杂度.

将您的采矿供应链转变为混合矿

产品混合与铁路和港口运营密切相关, 严重影响日常决策, 例如在哪里运输哪些组件或在哪里存放和/或提取组件.

理想的数字状态是一个全面的调度工具,为铁路和港口提供前瞻性的建议, 以混合优化模型集成为关键部分. 适当时(e).g., 因应不断变化的天气情况), 由授权的铁路和港口运营商临时解决问题可以纠正选定的建议.

对于每个独特的供应链,定制调度工具是有意义的. 使用一个 敏捷过程,我们可以在完整的数字工具发布之前确定产品混合的影响. 在任何时候,与运营者和协调者的密切合作将对解决任何问题大有帮助 变更管理 风险.

构造和编码构建调度应用程序所需的模型, 利用数据科学家的才能, 数据工程师,以及优化专家. 在当今充满挑战和竞争的环境中, 实施产品混合的企业在竞争中保持领先地位.

Toptal工程博客的编辑团队向 约翰。李 查看本文中提供的代码示例和其他技术内容.

了解基本知识

  • 什么是产品混合?

    产品混合是将各种成分混合在一起制成成品的过程.

  • 产品调配的必要性是什么?

    产品混合是创建所要求的定制产品所必需的.

  • 什么是供应链管理中的优化?

    优化供应链意味着提高其整体效率, 从源头到最终目的地.

  • 为什么优化供应链很重要?

    供应链优化非常重要,因为它是提高成本效率和满足客户需求的最佳杠杆之一.

  • 什么是纸浆存储库?

    纸浆是一个Python库,可以方便地访问许多优化框架.

就这一主题咨询作者或专家.
预约电话
迈克尔霍普夫的头像
迈克尔霍普夫

位于 德国杜塞尔多夫

成员自 2022年5月3日

作者简介

Michael是一名开发者, 数据科学顾问, 并擅长为铁路重工业客户提供供应链优化服务, 船只, 和矿业. 他拥有数学优化博士学位,是麦肯锡分析实践的顾问 & 公司的QuantumBlack工作了四年.

Toptal作者都是各自领域经过审查的专家,并撰写他们有经验的主题. 我们所有的内容都经过同行评审,并由同一领域的Toptal专家验证.

专业知识

以前在

麦肯锡 & 公司

世界级的文章,每周发一次.

订阅意味着同意我们的 隐私政策

世界级的文章,每周发一次.

订阅意味着同意我们的 隐私政策

Toptal开发者

加入总冠军® 社区.