如何定义以索引值为条件的 JuMP 表达式
How to define a JuMP expression conditional on index value
我正在尝试在 JuMP
中定义一个 @NLexpression
,它在不同的索引处具有不同的规格。在下面的示例中,我希望在 j != k
时将表达式 y[j,k]
定义为 1/(x[j] - x[k])
,并在 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)
您没有义务使用 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
我正在尝试在 JuMP
中定义一个 @NLexpression
,它在不同的索引处具有不同的规格。在下面的示例中,我希望在 j != k
时将表达式 y[j,k]
定义为 1/(x[j] - x[k])
,并在 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)
您没有义务使用 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