有没有办法使用作为数组的元组元素作为 "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;
}
}
我有一个简短的代码版本,以免解释过于复杂。基本上 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;
}
}