簡體   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