これを としてタグ付けしたので、制約ロジック プログラミング(CLP) で実装し、CLP 実装に組み込まれたアルゴリズムを使用するprolog
ことをお勧めします。部分的な例:
:- use_module(library(clpfd)).
on_time([]).
on_time([Task|Tasks]) :-
Task = task(TSuggested,TActual,L,Rs),
TActual #>= TSuggested - 10,
TActual #=< TSuggested + 10,
on_time(Tasks).
別の述語は、2 つのタスクが同じリソースを同時に使用しないことを確認します。
nonoverlap(R,Task1,Task2) :-
Task1 = task(_,T1,L1,Rs2),
Task2 = task(_,T2,L2,Rs2),
((member(R,Rs1), member(R,Rs2)) ->
T2 #> T1+L1 % start Task2 after Task1 has finished
#\/ % OR
T1 #> T2+L2 % start Task1 after Task2 has finished
;
true % non-conflicting, do nothing
).
最後に、labeling
すべての制約付き変数を呼び出して、それらに一貫した値を与えます。これは、整数時間単位で機能するCLP(fd)を使用します。CLP(R)は実数値の時間に対して同じことを行いますが、少し複雑です。リンクは SWI-Prolog 用ですが、SICStus とECLiPSeにも同様のライブラリがあります。