什么算法的调度程序

时间:2010-11-01 21:11:45

标签: algorithm prolog scheduling clpfd

我有调度任务的问题。每个任务都有一个建议的开始时间T(需要从[T-10,T + 10]开始),需要L分钟才能完成并使用多个资源[R1,R2,...]。使用资源时,没有其他任务可以使用它。鉴于只有开始时间是灵活的,我的目标是安排任务,以便他们可以访问他们需要的任何资源或指出所有需要解决的冲突。

我可以使用哪种算法来实现此目的?谢谢。

3 个答案:

答案 0 :(得分:4)

由于您已将其标记为prolog,因此我建议您在constraint logic programming(CLP)中使用CLP实施中内置的算法来实现它。部分示例:

:- 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).

另一个谓词会检查没有两个任务同时使用相同的资源:

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具有类似的库。

答案 1 :(得分:2)

使用约束编程CP或混合整数编程(MIP)可以最好地解决这样的调度问题。两者都是声明性方法,因此您只需要关注问题的属性,并让专用引擎处理基础算法。更多信息可以在维基百科上找到:

http://en.wikipedia.org/wiki/Constraint_programming

http://en.wikipedia.org/wiki/Linear_programming

答案 2 :(得分:1)

如果您有约束或您的问题域将向外扩展,您还应该查看不完美的算法,例如: