从数据帧构建目标函数

问题描述 投票:0回答:1

我有以下数据框,其中包含三维变量的索引和成本参数。

产品 工厂 成本
A F1 A1 10
A F2 A1 8
B F1 B1 20
C F2 C2 12

有3种产品,2个工厂,4个子产品。我定义了以下向量

Product=["A", "B", "C"]
Factory=["F1","F2"]
Sub=["A1","A2","B1","B2","C1","C2"]

我正在尝试为数据框中的变量构造以下目标函数(即不在表中的决策变量的系数为零)。

最小 10x[A,F1,A1]+ 8x[A,F2,A1] + 20x[B,F1,B1] + 12*x[C,F2,C2]

如何使用 JuMP 编写此代码。我尝试了以下代码

@objective(model, Min, sum(data.Cost[data.Product==product,data.Factory==factory,data.SubProduct==sub]*x[product, factory, sub] 
for product in Product, factory in Factory, sub in Sub))
julia julia-jump
1个回答
0
投票

首先需要定义 3 维决策变量。对于您的情况,这很可能如下所示:

julia> @variable(model, x[p=Product,f=Factory,s=Sub])
3-dimensional DenseAxisArray{VariableRef,3,...} with index sets:
    Dimension 1, ["A", "B", "C"]
    Dimension 2, ["F1", "F2"]
    Dimension 3, ["A1", "A2", "B1", "B2", "C1", "C2"]
And data, a 3×2×6 Array{VariableRef, 3}:
[:, :, "A1"] =
 x[A,F1,A1]  x[A,F2,A1]
....

现在为了便于阅读,假设您有一些函数知道

p
f
s
的某些值的成本。

function getcost(p,f,s)
    # do some search in DataFrame or better make an index utilizing a Dict
    10 # mockup value
end

您现在可以将目标函数定义为:

julia> @objective(model, Min, sum(x[p,f,s]*getcost(p,f,s) for p in Product, f in Factory, s in Sub))
10 x[A,F1,A1] + 10 x[A,F1,A2] + 10 x[A,F1,B1] + 10 x[A,F1,B2] + 10 x[A,F1,C1] + 10 x[A,F1,C2] + 10 x[A,F2,A1] + 10 x[A,F2,A2] + 10 x[A,F2,B1] + 10 x[A,F2,B2] + 10 x[A,F2,C1] + 10 x[A,F2,C2] + 10 x[B,F1,A1] + 10 x[B,F1,A2] + 10 x[B,F1,B1] + 10 x[B,F1,B2] + 10 x[B,F1,C1] + 10 x[B,F1,C2] + 10 x[B,F2,A1] + 10 x[B,F2,A2] + 10 x[B,F2,B1] + 10 x[B,F2,B2] + 10 x[B,F2,C1] + 10 x[B,F2,C2] + 10 x[C,F1,A1] + 10 x[C,F1,A2] + 10 x[C,F1,B1] + 10 x[C,F1,B2] + 10 x[C,F1,C1] + 10 x[C,F1,C2] + 10 x[C,F2,A1] + 10 x[C,F2,A2] + 10 x[C,F2,B1] + 10 x[C,F2,B2] + 10 x[C,F2,C1] + 10 x[C,F2,C2]
© www.soinside.com 2019 - 2024. All rights reserved.