在 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 int
或int
)。这是两种截然不同的类型是有充分理由的:任何只有参数的计算都保证能够在 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
类型,因为它取决于决策变量。
我正在尝试构建一个模型,其决策变量的范围为 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 int
或int
)。这是两种截然不同的类型是有充分理由的:任何只有参数的计算都保证能够在 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
类型,因为它取决于决策变量。