[英]How can a predefined list can be used for the summation indices in a JuMP @complements() function?
我正在尝试使用 JuMP 和互补库来解决 MPEC 程序。 问题是互补性限制中有求和,而我无法定义这些求和的索引。
using JuMP, Ipopt, Complementarity
G = ["g1","g2","g3","g4"]
P = ["p1","p2","p3","p4","p5","p6"]
T = ["t1","t2"]
m = Model(with_optimizer(Ipopt.Optimizer))
@variable(m, X[g in G] )
@variable(m, Y[g in G] )
@variable(m, W[p in P] )
@variable(m, Z[g in G, p in P, t in T] )
@variable(m, lambda[g in G] )
for g in G
@complements(m, 0<= X[g] + Y[g]*sum(W[p]*sum(Z[g,p,t] for t in T) for p in P), lambda[g] >= 0)
end
显然,它可以通过以下方式完成
for g in G
@complements(m, 0<= X[g] + Y[g]*sum(W[p]*sum(Z[g,p,t] for t in [1:2]) for p in [1:6]), lambda[g] >= 0)
end
但我正在尝试使用字符串列表(如第一个代码中所定义)来执行此操作。 此外,求和的限制需要不断改变。
我在使用 @mapping() 和 @complementarity() 函数之前已经这样做了,但它只适用于 MCP(而不是 MPEC)问题。
@complements
的非线性表达式似乎有问题。 最简单的解决方案是将其提取到单独的表达式中:
using JuMP, Ipopt, Complementarity
G = ["g1", "g2", "g3", "g4"]
P = ["p1", "p2", "p3", "p4", "p5", "p6"]
T = ["t1", "t2"]
m = Model(Ipopt.Optimizer)
@variable(m, X[g in G])
@variable(m, Y[g in G])
@variable(m, W[p in P])
@variable(m, Z[g in G, p in P, t in T])
@variable(m, lambda[g in G])
@NLexpression(
m,
my_expr[g in G],
X[g] + Y[g] * sum(W[p] * sum(Z[g, p, t] for t in T) for p in P),
)
for g in G
@complements(m, 0 <= my_expr[g], lambda[g] >= 0)
end
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.