【问题标题】:Coding arrays in constraint JuMP在约束 JuMP 中编码数组
【发布时间】:2021-10-03 21:41:54
【问题描述】:

请考虑以下图片:

我知道当我在@constraint 中使用a:b 时,它表示从ab 的数组。我需要在上述代码的@constraint 中编写像 {a_j,b_j} 这样的数组。你能帮我写代码吗?

【问题讨论】:

标签: julia julia-jump


【解决方案1】:

我了解到您询问的是针对单个约束的自定义索引迭代。这可以在 JuMP 中完成:

using JuMP, Cbc
m = Model(Cbc.Optimizer)
@variable(m,x[1:3,1:3]>=0)
@constraint(m, con[ (i,j) in [(1,2),(2,3),(3,3)] ], x[i,j] >= 5)

让我们看看我们得到了什么:

julia> println(m)
Feasibility
Subject to
 con[(1, 2)] : x[1,2] >= 5.0
 con[(2, 3)] : x[2,3] >= 5.0
 con[(3, 3)] : x[3,3] >= 5.0
 x[1,1] >= 0.0
 x[2,1] >= 0.0
 x[3,1] >= 0.0
 x[1,2] >= 0.0
 x[2,2] >= 0.0
 x[3,2] >= 0.0
 x[1,3] >= 0.0
 x[2,3] >= 0.0
 x[3,3] >= 0.0

【讨论】:

    【解决方案2】:

    要理解的关键点是——与 AMPL 和 GAMS 不同——没有专门的 在 JuMP 中构建和管理集合的语法。相反,您可以使用任何 可用的 Julia 语法和数据结构。

    例子:

    using JuMP
    N = 10
    model = Model();
    @variable(model, x[1:N]);
    @constraint(model, [s=1:3], sum(x[j] for j in 1:N if mod(j, s) == 0) == 1)
    
    using JuMP
    N = 10
    model = Model();
    @variable(model, x[1:N]);
    d = [Set([1, 2, 3]), Set([2, 4, 6])]
    a = [Set([3, 4]), Set([5])]
    J(s) = [j for j in 1:2 if s in union(d[j], a[j])]
    @constraint(model, [s=1:2], sum(x[j] for j in J(s)) == 1)
    

    【讨论】:

    • 我尝试了这两个代码。但它们在我的情况下不起作用。 d和a都是N大小的集合S的子集。例如:(N=5, T=3, S=6), j=1:N, t=1:T, s=1:S。 d=[1,2,2,3,1](d 的元素是 S 的前 3 位,d 的大小为 N)和a=[6,4,5,6,4](a 的元素是集合 S 的最后 3 位,a 的大小为 N)。现在我想编写索引 s 从 d 开始并以 a 结束的代码。就像这样 s[j=1]={1,6}, s[j=2]={2,4}, s[j=3]={2,5}, s[j=4]= {3,6}, s[j=5}={1,4}
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-18
    相关资源
    最近更新 更多