【问题标题】:what algorithm for a scheduling program调度程序的算法是什么
【发布时间】:2010-11-01 21:11:45
【问题描述】:

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

我可以为此目的使用哪种算法?谢谢。

【问题讨论】:

  • 您研究过哪些算法,为什么您认为它们不适用?
  • 这是作业吗?如果是这样,它应该有“作业”标签。
  • 这不是作业。而且我不是在要求详细的解决方案。我只需要一些算法建议,以便我研究一下。

标签: algorithm prolog scheduling clpfd


【解决方案1】:

由于您已将其标记为 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 有类似的库。

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

      如果您受到限制或您的问题域将向外扩展,您还应该看看不完善的算法,例如:

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-05-29
        • 1970-01-01
        • 2019-06-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多