Math 产品在不同供应商之间的成本优化

Math 产品在不同供应商之间的成本优化,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个,优化将如何改变 如果我能得到这个答案的答

我有以下优化问题。一家公司生产一种产品,比如大A。生产这种产品需要5道工序。(请查看下表中的详细信息)。对于每个过程,都有许多供应商为该特定过程提供原材料。例如,对于过程1,有3个供应商1、2和3


该公司首席执行官的约束条件是,对于每个流程,首席执行官必须首先从供应商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。对于第二个和第三个供应商,它等于前一个供应商(行)的最大数量?减去当前供应商(行)的所选数量
包含公式的屏幕截图:

还有两个制约因素:

  • 每个过程必须至少生产一个项目,并且
  • 项目总数应为700(或更高版本为1500)
  • 以下是他们的设置:

    以下是公式:

    简言之,我们使用
    SUMIF
    对每个供应商特定的数量求和,我们将限制每个流程的数量超过1项

    要完成电子表格设置,我们需要计算目标函数,即分配成本。这很容易通过获取列数量成本
    SUMPRODUCT
    来实现。请注意,累积量是派生数据,在当前上下文中不是很有用

    完成上述步骤后,电子表格如下所示:

    解算器模型

    对于解算器模型,我们需要声明

    • 目标
    • 决定
    • 制约因素
    • 解算器(并在必要时调整一些参数)
    为了便于说明,我给了每个范围标题的名称。解算器模型如下所示:

    它应该是解释性的,除了可能的
    所选>=0
    部分。所选列等于先前供应商的二进制
    最大数量
    减去当前供应商的
    所选
    之间的差值<代码>选中>=0=>
    前一供应商的最大数量
    >=
    当前供应商的选中
    。因此,如果以前的供应商不以最大数量(二进制=0)生产,则当前供应商无法生产

    然后,我们需要确保解算器设置正常:

    解决问题

    针对
    req=700的解决方案

    正如我们所看到的,该模型试图尽可能避免过程3和5,并通过为过程3和过程5选择恰好1个项目来满足“每个过程至少1个项目”的约束。目标函数值为
    11710

    针对
    req=1500的解决方案

    在这里,我们需要更多的容量,但过程3似乎很昂贵,模型试图避免所有人