2

我正在 Prolog 中编写任务调度程序/计划程序,为此我打算使用CLPFD 库(在 SWIPL 上)。我想知道使用有限域来解决调度问题有多强大,以及如果我使用它会对 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. */

它确实有效,而且速度非常快(实际上是瞬时的)。但这只是一个包含三个活动的简单案例,在我的最终程序中,我将拥有数百个活动,而调度问题将比这复杂得多。

谢谢你的建议!

4

1 回答 1

3

通常,CLP(FD) 是解决此类问题的合适且成熟的方法。但是请注意,即使在 内部也有许多不同的方法可以对您的问题进行建模library(clpfd):例如,您可以使用全局约束serialized/2cumulative/1表达它。其他 Prolog 系统通常会给您比 SWI-Prolog 更好的性能,但是您建模问题和搜索解决方案的方式通常比任何特定实现的优化更能影响性能。

于 2013-06-11T10:45:08.403 回答