有没有办法在minizinc谓词中提供搜索注释?

时间:2018-10-04 10:37:08

标签: minizinc

我想知道是否可以在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

在这里,我希望它在执行谓词时首先在numa之前求解b。有办法吗?我正在寻找类似于解决模型末尾提供的订单注释的内容。

1 个答案:

答案 0 :(得分:0)

可以设计搜索策略的唯一地方是解决项目,但您可能还会问:“我可以针对局部变量设计一个搜索策略吗?”

由于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;

请注意,只有在can(高估)谓词的调用次数并为每个调用赋予不同的变量(现在是全局变量)的情况下,这种方法才可行。除非您的谓词是递归的,否则这应该相对简单。

相关问题