Loops 跳转约束中变量子集的循环
我试图实现一个弧流问题,在这个问题中,我在一个数组中有一组弧。每个arc都是一个自定义数据结构,由from/to节点组成。我想添加一个约束,其中我只包括从特定节点(1)开始的圆弧,类似于:Loops 跳转约束中变量子集的循环,loops,constraints,julia,julia-jump,network-flow,Loops,Constraints,Julia,Julia Jump,Network Flow,我试图实现一个弧流问题,在这个问题中,我在一个数组中有一组弧。每个arc都是一个自定义数据结构,由from/to节点组成。我想添加一个约束,其中我只包括从特定节点(1)开始的圆弧,类似于: @constraint(m, sum(x[a] for a in arcs; a.from==1) == 1) 这是行不通的。处理这一问题的最佳方法是什么?有没有一种方法可以在不预先计算每个节点的所有传出弧的情况下执行此操作?如果是,有没有办法增加附加条件? 提前谢谢 Bernardo您需要将x重新定义为一
@constraint(m, sum(x[a] for a in arcs; a.from==1) == 1)
这是行不通的。处理这一问题的最佳方法是什么?有没有一种方法可以在不预先计算每个节点的所有传出弧的情况下执行此操作?如果是,有没有办法增加附加条件?
提前谢谢
Bernardo您需要将
x
重新定义为一个,即一个方阵,它具有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)
这遵循的是的标准Julia语法
但是,该表达式与普通Julia中的表达式一样低效,因为它在所有圆弧中循环。如果该循环成为瓶颈,则需要以另一种方式重新格式化表达式,例如,通过预计算每个节点的输出弧。这不涉及NxN变量的创建吗?在我的例子中,问题中的弧的数量明显低于NxN,我希望避免有这么多变量(每个弧只有一个)。在跳转模型中不能有条件指令(因为解算器不支持它)。如果您的目标是为大小为N的图形选择圆弧,那么自然会有NxN变量(或无向图形的一半)。如果你的N大于,取决于你问题的某些特定特征,你可以尝试重新构造它,但这是一个数学模型,而不是你的眼睛,解决了我的问题。我忘了提到,在构建约束时,我并不担心在所有圆弧上循环。