我有以下优化问题。一家公司生产一种产品,比如说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
此致
答案 0 :(得分:1)
我将从解决您发布的具体问题开始,然后将更加贬低如何制定问题。为简单起见,我将使用Excel
' Solver
加载项来解决问题,但使用任何配置的建模语言(例如AIMMS,AMPL ,LINGO,OPL,MOSEL,CPLEX和其他许多人使用求解器(GUROBI,GLPK,CBC,lpSolve 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似乎是一种有效的选择。
电子表格设置
为方便起见,我遵循一些惯例:
首先,让我们按照以下方式扩充您提供的表格:
添加的专栏简要说明:
(Process, Supplier)
组合产生正数,则等于1,否则为零。(Process, Supplier)
组合定义的生成数量。包含公式的屏幕截图:
还有两个限制因素:
以下是他们的设置:
以下是公式:
简而言之,我们使用SUMIF
对每个供应商特定的数量求和,我们将约束每个流程超过1个项目。
要完成电子表格设置,我们需要计算目标函数,即分配成本。这可以通过<{1>}列数量和费用轻松完成。请注意,累积数量是派生数据,在当前上下文中不是很有用。
完成上述步骤后,电子表格如下所示:
解决模型
对于解算器模型,我们需要声明
为了便于说明,我已经为每个范围指定了其标题的名称。求解器模型如下所示:
除了SUMPRODUCT
部分之外,它应该都是解释性的。选择的列等于前一个供应商的二进制Selected >= 0
减去当前供应商的max Quantity
之间的差异。 Selected
=&gt;当前供应商的先前供应商&gt; = Selected >= 0
的{{1}}。因此,如果前一个供应商未以最大数量(二进制= 0)生产,则当前供应商无法生产。
然后我们需要确保求解器设置正常:
并解决问题。
max Quantity
的解决方案:
正如我们所见,模型试图尽可能地避免程序3和5,并且满足约束&#34;每个过程至少1个项目&#34;通过为流程3和5选择恰好1个项目。目标函数值为Selected
。
req = 700
的解决方案:
在这里我们需要更多的容量,但是过程3看起来很昂贵,而且模型试图通过分配必要的东西(供应商1只有1个单位)来避免它。
我希望这会有所帮助。电子表格可以下载{{3}}。我在下面包含了数学模型的定义,以防你想将它转换成另一种语言。
数学公式
您的问题的正式定义如下。
<强> SETS 强>:
<强>参数强>:
<强>决定强>:
<强>目标强>:
<强>约束强>:
约束解释:
C1:如果供应商尚未分配到该流程,则供应商无法从流程中生成任何内容。
C2:如果供应商的最大指标设置为1,那么生产变量应该是最大可能的。
C3:如果我们尚未生成上一个供应商11,710
提供的最大数量,我们无法为流程req = 1,500
选择供应商s
。
C4:我们需要从每个流程中生成至少1个项目。
C5:所有流程和供应商的总产量应等于所需的数量。
答案 1 :(得分:-2)
看起来你应该看一下simplex算法(或者它的一些现有实现)。 维基百科有一个相当不错的算法描述,http://en.wikipedia.org/wiki/Simplex_algorithm