【发布时间】:2021-10-03 21:41:54
【问题描述】:
请考虑以下图片:
我知道当我在@constraint 中使用a:b 时,它表示从a 到b 的数组。我需要在上述代码的@constraint 中编写像 {a_j,b_j} 这样的数组。你能帮我写代码吗?
【问题讨论】:
-
这能回答你的问题吗? Dependent Arrays in Constraints JuMP
标签: julia julia-jump
请考虑以下图片:
我知道当我在@constraint 中使用a:b 时,它表示从a 到b 的数组。我需要在上述代码的@constraint 中编写像 {a_j,b_j} 这样的数组。你能帮我写代码吗?
【问题讨论】:
标签: julia julia-jump
我了解到您询问的是针对单个约束的自定义索引迭代。这可以在 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
【讨论】:
要理解的关键点是——与 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=[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}