我有一个模型需要约束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.
我可以用不同的方式编码这个约束吗?
答案 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
身份体验。