【发布时间】:2023-03-08 09:39:01
【问题描述】:
我正在使用 Julia 0.6.2 和 JuMP 0.18.5(我不能使用更新的版本,因为我需要使用旧包)。
使用索引条件创建 JuMP 变量会生成 JuMPDict 而不是数组。
例如:
m = Model(solver = CplexSolver())
# type of x: JuMP.JuMPDict{JuMP.Variable,2}
@variable(m, x[i in 1:3, j in 1:3; i < j] >= 0)
# type of y: JuMP.JuMPDict{JuMP.Variable,3}
@variable(m, y[i in 1:3, j in 1:3, k in 1:3; i < j] >= 0)
我想对 1:3 中的所有 k 应用一个函数 f 到 x 和 y[:, :, k]。但是,我不知道如何定义这样的通用函数。
我尝试将 f 的参数类型设置为 JuMP.JuMPDict{JuMP.Variable,2}:
function f(input::JuMP.JuMPDict{JuMP.Variable,2})
...
end
我可以在 x 上使用该函数,但不能在 y 上使用:
f(x) # Works
for k in 1:3
f(y[:, :, k]) # does not work as y is not an array
end
我最后的想法是将y转换成几个JuMP.JuMPDict{JuMP.Variable,2}:
function convertTo2D(dict3D::JuMP.JuMPDict{JuMP.Variable,3}, k::Int)
dict2D = JuMP.JuMPDict{JuMP.Variable,2}() # This line returns "ERROR: KeyError: key :model not found"
for (key, value) in keys(dict3D)
if key[3] == k
dict2D[(key[1], key[2])] = value # Not sure if it will work
end
end
return dict2D
end
如果这行得通,我可以使用:
for k in 1:3
f(convertTd2D(y, k))
end
你知道我可以如何修复 convertTo2D 或做我想做的其他方式吗?
【问题讨论】:
标签: dictionary julia dimensions julia-jump