minizinc

时间:2017-06-13 05:51:53

标签: minizinc

我有一个模型需要约束var float数组的每个元素是不同的

我尝试使用全局不同的全局约束,但是我收到以下错误:

MiniZinc: type error: no function or predicate with this signature found: `alldifferent(array[int] of var float)'

所以我用以下理解取代了不同的约束:

constraint forall (i,j in 1..nVERTICIES where i<j) (X[i] != X[j]);

但是现在我在使用地理编码解算器时出现以下错误:

Error: Registry: Constraint float_lin_ne not found

以及使用G12 MIP求解器时出现以下错误:

flatzinc: error: the built-in operation `float_lin_ne/3' is not supported by the MIP solver backend.

我可以用不同的方式编码这个约束吗?

2 个答案:

答案 0 :(得分:0)

对于你的第一个问题:根据official documentation,MiniZinc不支持不同的浮动。只支持整数。

对于你的第二个问题和第三个问题:你的求解器没有接缝来支撑浮子。也许你没有使用letest求解器和/或最新的MiniZinc?

另一个更好的解决方案是将浮动问题转换为整数问题。只需将浮点范围映射到整数范围即可。

答案 1 :(得分:0)

正如其他一些答复所提到的那样,(据我所知)浮点数没有alldifferent

您将这种全局约束表示为一系列二进制不等式是一种有效的方法,但是您遇到的问题反映了确定两个浮点数是否不同的困难(这是一个更广泛的问题,不仅限于此)到CP建模)。

您可以采取的一种解决方案是比较变量之间的绝对差,并强制该差必须大于某个可配置的值。

int: nVERTICES = 10;
float: epsilon = 0.001; % the minimum floats need to be apart to be considered not equal.

array[1..nVERTICES] of var -10.0..10.0: X;
constraint forall (i, j in 1..nVERTICES where i < j) (abs(X[i] - X[j]) >= epsilon);

solve satisfy;

output [ show(X) ];

还请注意,我已经在X上设置了一个域,而不仅仅是将其声明为浮点型。在切换为显式指定域之前,我一直以Gecode: Float::linear: Number out of limits身份体验。