Minizinc“无法确定浮动”的下限

时间:2018-12-04 07:04:35

标签: floating-point minizinc

我有一个minizinc模型,其中有一个距离矩阵:

array[1..n, 1..n] of var float: dist;

哪个将输出错误Error: Gecode: Float::linear: Number out of limits。如果我尝试用solve minimize sum(i,j in 1..n)(dist[i,j]);最小化矩阵(实际上代码更复杂)。下限对我很清楚。距离矩阵中的任何值都不能小于零。但是,使用下限制定约束将不起作用:

constraint forall(i,j in 1..n)(dist[i,j] >= 0.0);

缩小域将起作用。但是我不能提前说出域的上限(对于下面的代码,我只取了一个很大的数字,在某些情况下可能太小了):

array[1..n, 1..n] of var 0.0..1000000.0: dist;

是否只能定义下限?

我使用地理编码为6.0.1的Minizinc 2.2.1。

1 个答案:

答案 0 :(得分:2)

您将获得Error: Gecode: Float::linear: Number out of limits,因为Gecode(以及任何其他CP解算器)将需要为每个变量设置上限和下限。在您的目标中,您对每个范围为0.0..1000000.0的变量求和。在内部,MiniZinc为此求和表达式创建一个变量,并且该变量的域超出了Gecode的内部界限。

因此,我看到两种解决此问题的方法:

1)自己创建目标变量并为其设置一个上限。以下模型适用于MiniZinc 2.2.1和Gecode 6.0.1:

int: n = 3;
array[1..n, 1..n] of var 0.0..100000.0: dist; 
% a new variable for the objective term with a lower and upper bound
var 0.0..1000000.0: total_distance;  

constraint forall(i,j in 1..n)(dist[i,j] >= 0.0);

constraint    % set the objective term
   total_distance = sum(i,j in 1..n)(dist[i,j]);

solve minimize total_distance;

2)不要使用CP求解器,而应使用MIP(混合整数编程)求解器。他们可以处理具有无限边界的变量。 MiniZinc随附MIP求解器CBC,它可以毫无问题地解决以下MiniZinc模型:

int: n = 3;
array[1..n, 1..n] of var float: dist;

constraint forall(i,j in 1..n)(dist[i,j] >= 0.0);

solve minimize sum(i,j in 1..n)(dist[i,j]);