私は Prolog でタスク スケジューラ/プランナーをプログラミングしており、そのために(SWIPL で) CLPFD ライブラリを使用する予定です。スケジューリングの問題を解決するために有限領域を使用することの威力と、それを使用した場合の CPU 負荷への影響について考えていました。
スケジューリングの問題は、この論文の 10 ページに記載されているアサーションに基づいています: 「制約ベースのスケジューリング」。実際、私のタスク/アクティビティは非常に異種であり (プリエンプション可能なものもプリエンプト可能でないものもあります)、アクティビティ リソースの容量は異なります。現在、私は単純なケース (非プリエンプティブル、選言的スケジューリング) に取り組んでおり、次のような結果になりました。
/* 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. */
それは機能し、非常に高速です(実際には瞬間的です)。しかし、これは 3 つのアクティビティがある単純なケースにすぎません。最終的なプログラムでは何百ものアクティビティがあり、スケジューリングの問題はこれよりもはるかに複雑になります。
アドバイスありがとうございます!