在 MiniZinc 中支持带有决策变量的 pow()

Support for pow() with decision variables in MiniZinc

我正在尝试构建一个模型,其决策变量的范围为 0..10 和约束 它必须被 4.The 整除输出必须是最小化值 (x-7)^2 的输出。调查我发现 Gecode 已经支持它。

我尝试按如下方式构建模型,但使用内置 pow()

时出现错误
% Decision variable

var 0..10: x;  

% Constraints

constraint (x mod 4) == 0;

% Call to the resolver
int: obj = pow(x-7, 2);

solve minimize obj;

% Solution

output["x = ", show(x), "\nobj = ", show(obj)];

我收到以下错误:

MiniZinc: type error: initialisation value for `obj' has invalid type-inst: expected `int', actual `var int'

我认为这是因为将变量视为决策变量而不仅仅是整数参数。

@hankank 的解决方案是正确的。使用 var int: obj = pow(x-7, 2);

MiniZinc 中的变量(例如,var int)是决策变量,其他名称(您可能在 Python 中称其为变量)称为参数(例如,par intint)。这是两种截然不同的类型是有充分理由的:任何只有参数的计算都保证能够在 MiniZinc 编译期间执行,而任何使用变量的计算通常必须由求解器决定。

请注意,使用 pow 实际上也可能会给线性求解器(即 MIP 求解器)带来问题。在这种情况下,计算仍然可以进行线性计算,因为转换使用的是常数,但是表达式 pow(x,y) 其中两个参数都是变量无法由线性求解器决定。

要将 pow() 调用从求解时间移动到编译时间,您可以使用预先计算的数组:

% Decision variable

var 0..10: x;  

set of int: DomainX = 0..10;
array[DomainX] of int: xa = array1d(DomainX, [pow(i-7, 2) | i in DomainX]);

% Constraints

constraint (x mod 4) == 0;

% Call to the resolver
var int: obj = xa[x];

solve minimize obj;

% Solution

output["x = ", show(x), "\nobj = ", show(obj)];

正如 hakank 评论的那样,变量 obj 必须是 var int 类型,因为它取决于决策变量。