此算法不支持类型为 dexpr int 的索引数组 "Assign"
Indexing array "Assign" with type dexpr int not supported by this algorithm
我的问题是similar to one already asked,但是没有答案(至少没有一个被接受也不合适)。
我正在尝试做一个约束,我在下面进行了简化:
dexpr int startingWeekChanges[p in People] = 7 * y + 1;
...
for(p in People){
Assign[startingWeekChanges[p]] == 1;
}
但我发现这是不允许的(错误消息是 "Indexing array "Assign" with type dexpr int not supported by this algorithm")。
我无法切换到约束规划。有没有其他策略可以解决这个问题?
在https://www.ibm.com/developerworks/community/forums/html/topic?id=7bb1e7ff-ec3a-4e79-a8c4-c20050dfad0c&ps=25我回答了同样的问题并举了一个例子。
范围 r=1..5;
float value[r]=[2,3,4.5,1,0];
dvar int i in 1..5;
dexpr int j=6-i;
maximize sum(k in r) value[k]*(k==j);
subject to
{
}
execute
{
writeln("i=",i);
}
您似乎想将表达式定义为由变量索引的数组的值。这称为 元素约束 [1] 并且仅在约束规划的上下文中可用,因为线性规划求解器无法处理此类约束。
我认为这样的事情可能会成功:
forall (i in IndexSetForAssign)
Assign[i] == (sum (p in People) (startingWeekChanges[p] == i) >= 1);
如果至少有一个 startingWeekChanges[p]
的值为 i
,则它设置 Assign[i]
为 1。如果不是,则将 Assign[i]
设置为 0。
上面的表达式利用了一个事实,即您可以使用约束的真值(如果为真则为 1,否则为 0)进行建模。
我的问题是similar to one already asked,但是没有答案(至少没有一个被接受也不合适)。
我正在尝试做一个约束,我在下面进行了简化:
dexpr int startingWeekChanges[p in People] = 7 * y + 1;
...
for(p in People){
Assign[startingWeekChanges[p]] == 1;
}
但我发现这是不允许的(错误消息是 "Indexing array "Assign" with type dexpr int not supported by this algorithm")。
我无法切换到约束规划。有没有其他策略可以解决这个问题?
在https://www.ibm.com/developerworks/community/forums/html/topic?id=7bb1e7ff-ec3a-4e79-a8c4-c20050dfad0c&ps=25我回答了同样的问题并举了一个例子。
范围 r=1..5;
float value[r]=[2,3,4.5,1,0];
dvar int i in 1..5;
dexpr int j=6-i;
maximize sum(k in r) value[k]*(k==j);
subject to
{
}
execute
{
writeln("i=",i);
}
您似乎想将表达式定义为由变量索引的数组的值。这称为 元素约束 [1] 并且仅在约束规划的上下文中可用,因为线性规划求解器无法处理此类约束。
我认为这样的事情可能会成功:
forall (i in IndexSetForAssign)
Assign[i] == (sum (p in People) (startingWeekChanges[p] == i) >= 1);
如果至少有一个 startingWeekChanges[p]
的值为 i
,则它设置 Assign[i]
为 1。如果不是,则将 Assign[i]
设置为 0。
上面的表达式利用了一个事实,即您可以使用约束的真值(如果为真则为 1,否则为 0)进行建模。