遍历 JuMP 约束中的变量子集

Loop over subset of variables in JuMP constraint

我正在尝试实现一个弧流问题,我在数组中有一组弧。每条弧线都是由 from/to 个节点组成的自定义数据结构。我想添加一个约束,其中我只包含从特定节点 (1) 出发的弧,例如:

@constraint(m, sum(x[a] for a in arcs; a.from==1) == 1)

这不起作用。处理这个问题的最佳方法是什么?有没有一种方法可以在不首先预先计算每个节点的所有传出弧的情况下做到这一点?如果是这样,有没有办法添加额外的条件? 提前致谢

贝尔纳多

您需要将 x 重新定义为 adjacency matrix,这是一个具有 1(或边权重)的方阵,其中一对节点和 0 否则。

假设您正在考虑的顶点集是 N(例如 N = 1:10 对应 10 个顶点)您的约束现在可以如下所示:

@constraint(m, arcConstraint[n in N], sum(x[n,k] for k ∈ N) == 1 )

请注意,arcConstraint 只是约束名称,您可以稍后参考。

sum 也可以写成 sum(x[n,:]) 如果你真的知道你经历了整个专栏(取决于你的具体情况)。

我猜你要找的语法是

@constraint(m, sum(x[a] for a in arcs if a.from==1) == 1)

这遵循 generator expressions 的标准 Julia 语法。

但是,该表达式与普通 Julia 中的表达式一样低效,因为它循环遍历所有弧。如果此循环成为瓶颈,您将需要以另一种方式重新制定表达式,例如,通过预先计算每个节点的传出弧。