首页 > 解决方案 > 如何定义以索引值为条件的 JuMP 表达式

问题描述

我正在尝试定义在不同索引处具有不同规格的@NLexpressionin JuMP。在下面的示例中,我希望将表达式y[j,k]定义为1/(x[j] - x[k])whenj != k并采用其他值 when j == k。我可以通过定义一个辅助变量z并添加以索引值为条件的约束来模拟这种行为。是否有类似的方法来定义以索引值为条件的表达式?

using JuMP, Ipopt

model = JuMP.Model(with_optimizer(Ipopt.Optimizer))

@variable(model, 0 <= x[1:2])
@NLexpression(model, y[j=1:2,k=1:2], 1/(x[j] - x[k])) # <- problematic line

@variable(model, z[1:2,1:2])
for j=1:2, k=1:2
    if j == k
        @constraint(model, z[j,k] == 1)
    else
        @NLconstraint(model, z[j,k] == 1/(p[j] - p[k]))
    end
end

display(model)

标签: juliaexpressionjulia-jump

解决方案


您没有义务使用 JuMP 的宏来为表达式创建容器。您应该能够有条件地创建表达式,如下所示:

model = JuMP.Model()

@variable(model, 0 <= x[1:2])
y = Dict()  # Or Array, if you prefer.
for j=1:2, k=1:2
    if j == k
        y[j,k] = 1
    else
        y[j,k] = @NLexpression(model, 1/(p[j] - p[k]))
    end
end

推荐阅读