Minizinc 中 VaR 浮点决策变量数组的不相等约束



我有一个模型,需要约束 var 浮点数组的每个元素都不同

我尝试使用全局所有不同的全局约束,但出现以下错误:

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.

是否有其他方法可以对此约束进行编码?

对于您的第一个问题:根据官方文档,MiniZinc不支持所有不同的浮点数。仅支持整数。

对于第二个问题和第三个问题:您的求解器无法接缝以支持浮点数。也许您没有使用最容易的求解器和/或最新的MiniZinc?

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

正如其他一些回应所提到的,(据我所知(没有浮点数的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,直到我切换到明确指定域。

最新更新