有没有办法在 minizinc 谓词中提供搜索注释?
is there a way to provide search annotation in minizinc predicate?
我想知道我是否可以在 minizinc 谓词中提供搜索顺序。例如我有这样的代码
predicate numbers_falling_within_range (var int:a, var int:b)=
let {
var 213233..4535553: num;
} in
(a+b<num*64+64) /\ (a+b>num*64); %% pick a and b such that their sum fall within a range
这里我更喜欢当它执行谓词时,它首先解决 num
,然后再 a
或 b
。有办法吗?我正在寻找类似于解决我们在模型末尾提供的订单注释的东西。
你唯一可以设计搜索策略的地方是你解决项目,但你也可能会问:"Can I devise a search strategy over (to a predicate) local variables?"
由于 MiniZinc 是一种作用域语言,您无法在谓词之外真正访问这些变量,但您可以将它们提升到全局作用域:
int num_num = ???;
array[1..num_num] of var 213233..4535553: nums;
predicate numbers_falling_within_range (var int: a, var int: b, var int: num) =
(a+b<num*64+64) /\ (a+b>num*64);
% a call to the predicate
constraint numbers_falling_within_range(x, y, nums[1]);
solve ::int_search(nums, input_order, indomain_min) minimize cost;
请注意,只有在可以(过度)估计对谓词的调用次数并为每个调用提供不同的(现在是全局的)变量的情况下,这种方法才有可能。除非您的谓词是递归的,否则这应该相对简单。
我想知道我是否可以在 minizinc 谓词中提供搜索顺序。例如我有这样的代码
predicate numbers_falling_within_range (var int:a, var int:b)=
let {
var 213233..4535553: num;
} in
(a+b<num*64+64) /\ (a+b>num*64); %% pick a and b such that their sum fall within a range
这里我更喜欢当它执行谓词时,它首先解决 num
,然后再 a
或 b
。有办法吗?我正在寻找类似于解决我们在模型末尾提供的订单注释的东西。
你唯一可以设计搜索策略的地方是你解决项目,但你也可能会问:"Can I devise a search strategy over (to a predicate) local variables?"
由于 MiniZinc 是一种作用域语言,您无法在谓词之外真正访问这些变量,但您可以将它们提升到全局作用域:
int num_num = ???;
array[1..num_num] of var 213233..4535553: nums;
predicate numbers_falling_within_range (var int: a, var int: b, var int: num) =
(a+b<num*64+64) /\ (a+b>num*64);
% a call to the predicate
constraint numbers_falling_within_range(x, y, nums[1]);
solve ::int_search(nums, input_order, indomain_min) minimize cost;
请注意,只有在可以(过度)估计对谓词的调用次数并为每个调用提供不同的(现在是全局的)变量的情况下,这种方法才有可能。除非您的谓词是递归的,否则这应该相对简单。