该算法不支持类型为dexpr int的索引数组“分配”

时间:2019-04-12 19:59:11

标签: optimization cplex opl ilog

我的问题是similar to one already asked,但没有答案(至少没有一个答案或不合适的答案)。

我正在尝试进行约束,下面对此进行了简化:

dexpr int startingWeekChanges[p in People] = 7 * y + 1; 

...

for(p in People){
    Assign[startingWeekChanges[p]] == 1;
}

但是我看到这是不允许的(错误消息是“此算法不支持类型为dexpr int的索引数组“ Assign””)。

我无法切换到约束编程。有没有其他策略可以解决这个问题?

3 个答案:

答案 0 :(得分:3)

我认为这样可以解决问题:

forall (i in IndexSetForAssign)
   Assign[i] == (sum (p in People) (startingWeekChanges[p] == i) >= 1);

如果至少一个Assign[i]的值为startingWeekChanges[p],它将i设置为1。如果不是,则将Assign[i]设置为0。

上面的表达式利用了您可以使用约束的真值(如果为true,则为1,否则为0)这一事实。

答案 1 :(得分:1)

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);
}

致谢

答案 2 :(得分:0)

似乎您想将表达式定义为由变量索引的数组的值。这称为 element约束 [1],它仅在Constraint编程的情况下可用,因为线性规划求解器无法应对此类约束。

[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