我有以下数据框,其中包含三维变量的索引和成本参数。
产品 | 工厂 | 子 | 成本 |
---|---|---|---|
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))
首先需要定义 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]