2015-10-09 2 views
1

Я реализую простую модель в 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)]; 

ответ

2

Я не уверен, если это лучший подход, но может проверить с помощью "происходит()" внутри "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

+0

Thank you. Исай, как работает «происходит». Что касается стратегии поиска, я попробовал несколько комбинаций, но, похоже, лучше всего быстро получить решение и улучшить его. Другая стратегия поиска, которая отлично работает (которую я удалил для простоты), состоит в том, чтобы обеспечить сортировку массива 'when' путем уменьшения приоритета и использования input_order, так как ожидается, что приоритетные задачи запланированы чаще, чем low-prio. У меня также возникают проблемы, если я увеличиваю количество задач и слотов (1000, 1000), он сбой или использует всю мою оперативную память. Думаю, я попрошу об этом в другом вопросе. – siritinga

Смежные вопросы