【问题标题】:JuMPDict change of dimensionJuMPDict 维度变化
【发布时间】: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


    【解决方案1】:

    匿名变量解决了我的问题。多亏了他们,我可以在 for 循环中连续创建 y 的变量。变量 y 现在是“2D 字典”数组,而不是“3D 字典”:

    y = Array{JuMP.JuMPDict{JuMP.Variable,2}, 1}([])
    
    for k in 1:3
        yk = @variable(m, [i in 1:3, j in 1:3; i < j] >= 0)
        f(yk)
        push!(y, yk)
    end
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-01-02
      • 2013-08-10
      • 1970-01-01
      • 2015-07-22
      • 1970-01-01
      • 2015-07-05
      • 1970-01-01
      相关资源
      最近更新 更多