我的问题是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””)。
我无法切换到约束编程。有没有其他策略可以解决这个问题?
答案 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)
我回答了同样的问题,并举了一个例子。
范围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编程的情况下可用,因为线性规划求解器无法应对此类约束。