我在用Zimpl声明2D变量时遇到了很大的挑战。 (参数似乎可以正常工作。)
以下是我的MWE:
set I := {1 to 10};
set J := {1 to 5};
param A[I*J] := read InputFile as "n+";
var x[I] binary;
var s[J] binary; # this works but doesn't do what I need
var s2[I*J] binary; # this does what I need but doesn't work
minimize sum<i,j> in I*J with A[i,j] < 5: (s2[i,j] - x[i]) * A[i,j];
# this constraint compiles
subto constraint1:
forall <j> in J do sum <i> in I with A[i,j] < 5: x[i] <= 1 + s[j];
# this constraint does not compile
subto constraint2:
forall <j> in J do sum <i> in I with A[i,j] < 5: x[i] <= 1 + s2[i,j];
尝试创建lp文件时,我得到了
Error 133: Unknown symbol "i"
有人对我如何获得第二个约束起作用有任何见解吗?据我所知,这与Zimpl用户手册中关于功能限制设施问题(第6.3节)的实现相同。
谢谢。
答案 0 :(得分:2)
您在约束的左侧获得了i的总和,但在右侧也引用了i。您希望我在那里获得哪个值?
可行的是
forall <j> in J do sum <i> in I with A[i,j] < 5: (x[i] - s2[i,j]) <= 1;
但我不确定这是您要实现的目标。
添加Leon的评论以获得更完整的答案:
要添加Gerald编写的内容,在ZIMPL中,总和始终仅考虑下一个变量,因此必须加上括号以使其起作用。
答案 1 :(得分:2)
要添加Gerald编写的内容,在ZIMPL中,总和始终仅考虑下一个变量,因此必须加上括号以使其起作用。
答案 2 :(得分:0)
在最小化时缺少名称。 应该最小化obj:sum ...