我试图用一个决策变量构建一个模型,该变量的范围为0..10,约束条件是它必须被4整除。输出必须是最小化值(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'我认为发生这种情况是因为将变量视为决策变量,而不仅仅是整数参数。
发布于 2020-11-22 10:57:50
要将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类型,因为它依赖于决策变量。
发布于 2020-11-22 10:44:00
@hankank的解决方案是正确的。使用var int: obj = pow(x-7, 2);
var int中的变量(例如,MiniZinc )是决策变量,其他名称(在MiniZinc中可能称为变量)称为参数(例如par int或int)。这是两种截然不同的类型,原因很充分:任何只包含参数的计算都保证能够在MiniZinc编译期间执行,而任何使用变量的计算通常都必须由求解者来决定。
请注意,使用pow实际上也可能给线性求解器(即MIP求解器)带来问题。在这种情况下,计算仍然可以是线性的,因为转换使用的是常量,但是两个参数都是变量的表达式pow(x,y)不能由线性求解器决定。
https://stackoverflow.com/questions/64949609
复制相似问题