ZIMPL:约束中无法识别2D变量声明

时间:2019-03-05 20:14:47

标签: linear-programming scip

我在用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节)的实现相同。

谢谢。

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 ...