Стратегия поиска с необязательными переменными

Я реализую простую модель в Minizinc для планирования задач с различным приоритетом и продолжительностью в ряде временных интервалов, но не все задачи могут быть запланированы, поэтому некоторые из них будут опущены, и я пытаюсь максимизировать сумму приоритетов запланированные задачи.

У меня есть рабочая версия, где задачи определены в массиве переменных, а незапланированные задачи имеют время 0. Ограничения имеют несколько предложений where, чтобы учитывать только запланированные задачи (когда [i]>0). Стратегия поиска по умолчанию очень медленная, поэтому я изменил ее на другую, которая работала намного лучше, используя Gecode в качестве решателя.

Сейчас я реализую другую версию, используя необязательные переменные, чтобы избавиться от предложений where, чтобы проверить, есть ли улучшения. Однако, похоже, я не могу определить стратегию поиска int_search() при использовании opt var.

Есть ли способ сделать это?

Рабочая модель выглядит следующим образом (закомментировано предложение о поиске со стратегией поиска, которую я хочу попробовать):

int: numtasks=100;
int: numslots=100;

set of int: TASK=1..numtasks;
set of int: SLOT=1..numslots;
array[TASK] of var opt 1..numslots: when;
array[TASK] of int: duration = [(i mod 3)+1 | i in TASK];
array[TASK] of int: prio = [(i mod 10)+1 | i in TASK]; 

include "globals.mzn";
constraint disjunctive(when, duration);

var int: obj = sum(i in TASK where not absent(when[i]))(prio[i]);
%solve ::int_search(when, input_order, indomain_random, complete) maximize obj;
solve maximize obj;

output [show(obj)," ",show(when)];

1 ответ

Решение

Я не уверен, что это лучший подход, но можно проверить с помощью "происхо- дит" внутри "int_search", т.е.

 solve ::int_search([occurs(when[t]) | t in TASK], input_order, indomain_random, complete) maximize obj;

Кроме того, я рекомендую вам протестировать с некоторыми другими надписями, кроме input_order/indomain_random, например first_fail/indomain_split и т. Д.

/ Hakan

Другие вопросы по тегам