此算法不支持类型为 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] 并且仅在约束规划的上下文中可用,因为线性规划求解器无法处理此类约束。

[1] https://www.ibm.com/support/knowledgecenter/SSSA5P_12.9.0/ilog.odms.ide.help/OPL_Studio/opllangref/topics/opl_langref_constraints_types_inCP.html#usropllangref.uss_langref_constraints.1073721__section1319017294580

我认为这样的事情可能会成功:

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)进行建模。