我正在Prolog中编写任务调度程序/计划程序,为此我打算使用CLPFD library(在SWIPL上)。我想知道使用有限域来解决调度问题是多么强大,以及如果我使用它会对CPU负载产生什么影响。
调度问题将基于本文第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. */
它确实有效,而且速度非常快(实际上是非常的)。但这只是一个包含三个活动的简单案例,在我的最终程序中我将有数百个活动,而且调度问题将比这复杂得多。
感谢您的建议!
答案 0 :(得分:3)
通常,CLP(FD)是解决此类问题的合适且成熟的方法。但请注意,即使在library(clpfd)
内,也有许多不同的方法可以对问题进行建模:例如,您可以使用全局约束serialized/2
或cumulative/1
来表达它。其他Prolog系统通常会比SWI-Prolog提供更好的性能,但是您对问题建模和搜索解决方案的方式通常会比任何特定实现的优化更多地影响性能。