不同供应商对产品的成本优化

时间:2014-07-25 07:13:53

标签: math optimization dynamic-programming mathematical-optimization linear-programming

我有以下优化问题。一家公司生产一种产品,比如说Big A.要生产这种产品,它需要5个工序。 (请在下面找到详细信息表)。对于每个流程,有许多供应商为该特定流程提供原材料。例如。对于过程1,有3个供应商1,2& 3.

对于这家公司的首席执行官来说,C语言的约束是,对于每个流程,首席执行官必须首先从供应商1购买供应品,然后从第二供应商处购买额外供应品等等。

优化问题是C需要700个单位来生产1个Big 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

此致

2 个答案:

答案 0 :(得分:1)

我将从解决您发布的具体问题开始,然后将更加贬低如何制定问题。为简单起见,我将使用Excel' Solver加载项来解决问题,但使用任何配置的建模语言(例如AIMMSAMPLLINGOOPLMOSELCPLEX和其他许多人使用求解器(GUROBIGLPKCBClpSolve package和许多其他的)可以使用。如果您想使用R,则存在一个lpSolve solver来调用the commercial solvers CPLEX, GUROBI and XPRESS perform a lot better than others(这不是最好的一个,说实话,但它是免费的)。

注意"真实" (大规模)整数问题,Hans Mittelman's page。在大多数测试(包括this add-in)中表现良好的第一个完全免费的求解器是CBC。通过使用here,CBC可以连接到excel并解决内置求解器模型,而不受约束或变量数量的限制。因此,假设优化算法将花费大部分CPU,使用CBC / OpenSolver似乎是一种有效的选择。

电子表格设置

为方便起见,我遵循一些惯例:

  • 决策变量单元格标记为绿色。
  • 约束标记为红色。
  • 数据标记为灰色。
  • 目标函数标记为蓝色。

首先,让我们按照以下方式扩充您提供的表格:

enter image description here

添加的专栏简要说明:

  • 已选择?:如果允许(Process, Supplier)组合产生正数,则等于1,否则为零。
  • 数量:为每个(Process, Supplier)组合定义的生成数量。
  • 最大数量?:如果供应商为该特定流程生成最大单位数,则等于1.
  • 数量UB :等于单位 * 已选择?。当允许供应商生成此流程时,这会使上限等于单位,否则为零。
  • 数量LB :等于单位 * 最大数量?。这是为了确保只要最大数量?列为1,生成的数量将等于单位
  • 选择:对于第一个供应商,它等于0.对于第二个和第三个供应商,它等于前一个供应商(行)的最大数量?减去当前供应商(行)已选择

包含公式的屏幕截图:

enter image description here

还有两个限制因素:

  1. 每个流程必须至少生成一个项目
  2. 项目总数应为700(或稍后1,500)。
  3. 以下是他们的设置:

    enter image description here

    以下是公式:

    enter image description here

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

    要完成电子表格设置,我们需要计算目标函数,即分配成本。这可以通过<{1>}列数量费用轻松完成。请注意,累积数量是派生数据,在当前上下文中不是很有用。

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

    enter image description here

    解决模型

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

    • 目标
    • 决定
    • 约束
    • 解算器(如果需要,可以调整一些参数)。

    为了便于说明,我已经为每个范围指定了其标题的名称。求解器模型如下所示:

    enter image description here

    除了SUMPRODUCT部分之外,它应该都是解释性的。选择的列等于前一个供应商的二进制Selected >= 0减去当前供应商的max Quantity之间的差异。 Selected =&gt;当前供应商的先前供应商&gt; = Selected >= 0的{​​{1}}。因此,如果前一个供应商未以最大数量(二进制= 0)生产,则当前供应商无法生产。

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

    enter image description here

    并解决问题。

    max Quantity 的解决方案:

    enter image description here

    正如我们所见,模型试图尽可能地避免程序3和5,并且满足约束&#34;每个过程至少1个项目&#34;通过为流程3和5选择恰好1个项目。目标函数值为Selected

    req = 700 的解决方案:

    enter image description here

    在这里我们需要更多的容量,但是过程3看起来很昂贵,而且模型试图通过分配必要的东西(供应商1只有1个单位)来避免它。

    我希望这会有所帮助。电子表格可以下载{{3}}。我在下面包含了数学模型的定义,以防你想将它转换成另一种语言。

    数学公式

    您的问题的正式定义如下。

    <强> SETS

    enter image description here

    <强>参数enter image description here

    <强>决定enter image description here

    <强>目标

    enter image description here

    <强>约束enter image description here

    约束解释

    C1:如果供应商尚未分配到该流程,则供应商无法从流程中生成任何内容。

    C2:如果供应商的最大指标设置为1,那么生产变量应该是最大可能的。

    C3:如果我们尚未生成上一个供应商11,710提供的最大数量,我们无法为流程req = 1,500选择供应商s

    C4:我们需要从每个流程中生成至少1个项目。

    C5:所有流程和供应商的总产量应等于所需的数量。

答案 1 :(得分:-2)

看起来你应该看一下simplex算法(或者它的一些现有实现)。 维基百科有一个相当不错的算法描述,http://en.wikipedia.org/wiki/Simplex_algorithm