有没有办法使用作为数组的元组元素作为 "forall" 循环的 "sum" 中的集合?

Is there a way to use a tuple element which is an array, as a set inside a "sum" of a "forall" loop?

我有一个简短的代码版本,以免解释过于复杂。基本上 N_B 只是一组相互连接的节点,例如节点 1 连接到节点 2 和 3;节点 4 连接到节点 5、6 和 7。我需要在元组中的第一个节点与每个时间“t”的所有辅助节点的总和之间进行乘法运算。节点收集在“I”中。但它给出了“无法提取表达式”错误。我知道错误与此行 sum(j in i.node2) 有关,但我不知道为什么或如何修复它。

range T=1..12;
range I=1..7;
dvar float C_all;
dvar float V[I][T];

tuple N_B_type{
    int node1;
    {int} node2;
}
{N_B_type} N_B={<1,{2,3}>,<4,{5,6,7}>};

minimize C_all;
subject to{
    
    forall(i in N_B,t in T){
    
       -V[i.node1][t]*(sum(j in i.node2)(V[j][t]))==0;
    
    }
    
    
}

因为 ab==0 等同于 a==0 或 b==0 你可以这样写

forall(i in N_B,t in T){
    
       -V[i.node1][t]==0 || (sum(j in i.node2)(V[j][t]))==0;
    
    }

如果您在 CPLEX 中使用 MIP,则不能编写这样的 x 次 y 如果您转到 CPLEX 中的约束编程,那么您可以。

以下工作正常

using CP;
range T=1..12;
range I=1..7;
dvar int C_all;
dvar int V[I][T];

tuple N_B_type{
    int node1;
    {int} node2;
}
{N_B_type} N_B={<1,{2,3}>,<4,{5,6,7}>};

minimize C_all;
subject to{
    
    forall(i in N_B,t in T){
    
       -V[i.node1][t]*(sum(j in i.node2)(V[j][t]))==0;
    
    }
    
    
}