Math 产品在不同供应商之间的成本优化
我有以下优化问题。一家公司生产一种产品,比如大A。生产这种产品需要5道工序。(请查看下表中的详细信息)。对于每个过程,都有许多供应商为该特定过程提供原材料。例如,对于过程1,有3个供应商1、2和3Math 产品在不同供应商之间的成本优化,math,optimization,dynamic-programming,mathematical-optimization,linear-programming,Math,Optimization,Dynamic Programming,Mathematical Optimization,Linear Programming,我有以下优化问题。一家公司生产一种产品,比如大A。生产这种产品需要5道工序。(请查看下表中的详细信息)。对于每个过程,都有许多供应商为该特定过程提供原材料。例如,对于过程1,有3个供应商1、2和3 该公司首席执行官的约束条件是,对于每个流程,首席执行官必须首先从供应商1处购买供应品,然后从第二个供应商处购买额外供应品,依此类推 优化问题是C需要700个单位的总材料来生产1个单位的大A,那么他将如何以最低的成本做到这一点。如果需要的单位数量增加到1500个,优化将如何改变 如果我能得到这个答案的答
该公司首席执行官的约束条件是,对于每个流程,首席执行官必须首先从供应商1处购买供应品,然后从第二个供应商处购买额外供应品,依此类推 优化问题是C需要700个单位的总材料来生产1个单位的大A,那么他将如何以最低的成本做到这一点。如果需要的单位数量增加到1500个,优化将如何改变 如果我能得到这个答案的答案,我将不胜感激。但是,如果有人能就这个问题向我推荐一些参考资料,这也将是一个很大的帮助。我在这里主要使用R软件
Process Supplier Cost Units Cumm_Cost Cumm_Unit
1 1 10 100 10 100
1 2 20 110 30 210
1 3 10 200 40 410
2 1 20 100 20 100
2 2 30 150 50 250
2 3 10 150 60 400
3 1 40 130 40 130
3 2 30 140 70 270
3 3 50 120 120 390
4 1 20 120 20 120
4 2 40 120 60 240
4 3 20 180 80 420
5 1 30 180 30 180
5 2 10 160 40 320
5 3 30 140 70 460
在这方面,看起来您应该看看单纯形算法(或它的一些现有实现)。
Wikipedia对算法有相当好的描述,我将从解决您发布的特定问题开始,然后将演示如何更抽象地表述问题。为了简单起见,我将使用
Excel
的Solver
插件来解决这个问题,但是可以使用建模语言的任何配置(例如、、和许多其他配置)以及解算器(、、和许多其他配置)。如果您想使用R
,则存在一个调用的(老实说,这不是世界上最好的,但它是免费的)
请注意,对于“真实”(大规模)整数问题。第一个在大多数测试(包括)中表现良好的完全自由解算器是CBC。CBC可以连接到excel中,通过使用,在不限制约束或变量数量的情况下求解内置的求解器模型。因此,假设大部分CPU将用于优化算法,使用CBC/OpenSolver似乎是一个有效的选择
电子表格设置
为了方便起见,我遵循一些惯例:
- 决策变量单元格标记为绿色
- 约束标记为红色
- 数据标记为灰色
- 目标函数标记为蓝色
- 所选?:如果允许
组合产生正数量,则等于1,否则为零(流程、供应商)
- 数量:为每个
组合定义的生产数量(流程、供应商)
- 最大数量?:如果供应商为该特定过程生产的单位数量最大,则等于1
- 数量UB:等于所选的单位。这使得当允许供应商生产此工艺时,上限等于单位,否则为零
- 数量LB:等于单位*最大数量?。这是为了确保每当最大数量?列为1时,生产数量将等于单位
- 选择:对于第一个供应商,它等于0。对于第二个和第三个供应商,它等于前一个供应商(行)的最大数量?减去当前供应商(行)的所选数量李>
SUMIF
对每个供应商特定的数量求和,我们将限制每个流程的数量超过1项
要完成电子表格设置,我们需要计算目标函数,即分配成本。这很容易通过获取列数量和成本的SUMPRODUCT
来实现。请注意,累积量是派生数据,在当前上下文中不是很有用
完成上述步骤后,电子表格如下所示:
解算器模型
对于解算器模型,我们需要声明
- 目标
- 决定
- 制约因素
- 解算器(并在必要时调整一些参数)
所选>=0
部分。所选列等于先前供应商的二进制最大数量
减去当前供应商的所选
之间的差值<代码>选中>=0=>前一供应商的最大数量
>=当前供应商的选中
。因此,如果以前的供应商不以最大数量(二进制=0)生产,则当前供应商无法生产
然后,我们需要确保解算器设置正常:
解决问题
针对req=700的解决方案
:
正如我们所看到的,该模型试图尽可能避免过程3和5,并通过为过程3和过程5选择恰好1个项目来满足“每个过程至少1个项目”的约束。目标函数值为11710
针对req=1500的解决方案
:
在这里,我们需要更多的容量,但过程3似乎很昂贵,模型试图避免所有人