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