繁体   English   中英

如何将预定义列表用于 JuMP @complements() 函数中的求和索引?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM