Есть ли способ предоставить поисковую аннотацию в предикате minizinc? - PullRequest
0 голосов
/ 04 октября 2018

Мне интересно, смогу ли я указать порядок поиска в предикате 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.Есть ли способ сделать это?Я ищу что-то похожее для решения аннотации заказа, которую мы предоставляем в конце модели.

1 Ответ

0 голосов
/ 04 октября 2018

Единственное место, где вы можете разработать стратегию поиска, - это решить элемент, но вы также можете спросить: «Могу ли я разработать стратегию поиска по (предикату) локальным переменным?»

Поскольку 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 (сверх-) оцените количество вызовов к предикату и присвойте каждому вызову отдельную (теперь глобальную) переменную.Если ваш предикат не является рекурсивным, это должно быть относительно просто.

...