Я программирую планировщик задач/планировщик в Prolog, и для этого я планирую использовать CLPFD library (на SWIPL). Мне было интересно, насколько мощным является использование конечных доменов для решения задач планирования и того, какое влияние будет оказывать на загрузку процессора, если я его использую.Производительность библиотеки CLP над конечными доменами Prolog
Проблема планирования будет основана на утверждениях, указанных на странице 10 настоящего документа: «Constraint-Based Scheduling». На самом деле мои задачи/действия будут очень неоднородными (некоторые из них будут превентивными, а другие - нет), а ресурсы деятельности будут иметь разные возможности. Прямо сейчас, я просто работаю на простом случае (не прерываться, дизъюнктивное планирование), и я пришел к чему-то вроде этого:
/* Non-preemptive, disjunctive scheduling. *******************************/
planner :-
/* 'S' stands for start point.
'E' stands for end point. */
set(a1,S1,E1),
set(a2,S2,E2),
set(a3,S3,E3),
interval(intersection,[S1,E1],[S2,E2],[]), % Tests whether activities
interval(intersection,[S2,E2],[S3,E3],[]), % intersect. If they do,
interval(intersection,[S3,E3],[S1,E1],[]), % backtracking occurs and
(...). % an alternative solution
% will be looked for.
/* A set of times in which activity A executes (non-preemptive) */
set(A,[S],[E]) :-
/* 'A' is the activity.
'R' is release point and 'D' deadline point.
'Lst' stands for Latest Start Point.
'Eet' stands for Earliest End Point. */
preemptable(A,no),
rd(A,R,D),
p(A,P),
Lst is D-P,
Eet is R+P,
S in R..D,
E in R..D,
S #=< Lst,
E #>= Eet,
S #< E,
P #= E-S,
indomain(S),
indomain(E).
set(A,[],[]). /* When the activity can't be scheduled. */
Это делает работу, и это очень быстро (intstantaneous на самом деле) , Но это всего лишь простой случай с тремя действиями, когда в моей последней программе у меня будет сотни из них, и проблема планирования будет намного сложнее, чем эта.
Спасибо за ваш совет!
Спасибо за ваш ответ @mat! Я не знал, что эти предикаты существуют, и я думаю, что теряю много больше, чем только эти два? Я до сих пор не понимаю, как использовать 'cumulative/1'. –
В дополнение к 'cumulative/1' и' serialized/2', так называемые * reified * ограничения могут также быть полезны в какой-то момент для вас. Они позволяют вам отражать значение истины ограничения в булевой переменной. Помимо этого, удачи в ваших экспериментах: я предлагаю вам выбрать рецепт и попробовать его по вашей проблеме! – mat