使用Prolog将任务调度到单个资源

使用Prolog将任务调度到单个资源,prolog,scheduling,clpfd,resource-scheduling,Prolog,Scheduling,Clpfd,Resource Scheduling,我尽可能地在这里搜索,虽然我找到了一些相关的问题,但我认为它们没有涵盖手头的问题: 假设只有一个资源和已知的请求列表来安排任务。每个请求包括开始时间、开始时间、预期持续时间和操作 目标是尽快安排要执行的任务,同时将每个任务安排在start_after和start_by之间 我编写了一个简单的Prolog示例,我“认为”应该可以工作,但不幸的是,我在运行时遇到了错误:“>=/2:参数没有充分实例化” 任何帮助或建议都将不胜感激 startAfter(1,0). startAfter(2,0). s

我尽可能地在这里搜索,虽然我找到了一些相关的问题,但我认为它们没有涵盖手头的问题:

假设只有一个资源和已知的请求列表来安排任务。每个请求包括开始时间、开始时间、预期持续时间和操作

目标是尽快安排要执行的任务,同时将每个任务安排在start_after和start_by之间

我编写了一个简单的Prolog示例,我“认为”应该可以工作,但不幸的是,我在运行时遇到了错误:“>=/2:参数没有充分实例化”

任何帮助或建议都将不胜感激

startAfter(1,0).
startAfter(2,0).
startAfter(3,0).

startBy(1,100).
startBy(2,500).
startBy(3,300).

duration(1,199).
duration(2,199).
duration(3,199).

action(1,'noop1').
action(2,'noop2').
action(3,'noop3').

can_run(R,T) :- startAfter(R,TA),startBy(R,TB),T>=TA,T=<TB.
conflicts(T,R1,T1) :- duration(R1,D1),T=<D1+T1,T>T1.
schedule(R1,T1,R2,T2,R3,T3) :- 
           can_run(R1,T1),\+conflicts(T1,R2,T2),\+conflicts(T1,R3,T3),
           can_run(R2,T2),\+conflicts(T2,R1,T1),\+conflicts(T2,R3,T3),
           can_run(R3,T3),\+conflicts(T3,R1,T1),\+conflicts(T3,R2,T2).

% when traced I *should* see T1=0, T2=400, T3=200
startAfter(1,0)。
startAfter(2,0)。
startAfter(3,0)。
startBy(1100)。
startBy(2500)。
startBy(3300)。
期限(1199年)。
持续时间(2199年)。
持续时间(3199)。
行动(1,'noop1')。
行动(2,'noop2')。
行动(3,'noop3')。

can_run(R,T):-startAfter(R,TA),startBy(R,TB),T>=TA,T=最初的实现有几个问题。它可以在约束逻辑编程系统中正常工作(稍加修改),但在纯Prolog中则不行。在Prolog中,目标的顺序是至关重要的。我已经修改了代码,以便它能够工作:

can_run(R, T) :-
    startAfter(R,TA),
    startBy(R,TB),
    between(TA,TB,T).

conflicts(T,R1,T1) :- 
    duration(R1,D1),
    T=<D1+T1,
    T>=T1.

schedule(R1,T1,R2,T2,R3,T3) :- 
    can_run(R1,T1), 
    can_run(R2,T2), 
    R1 \= R2,
    \+ conflicts(T1,R2,T2),
    can_run(R3,T3),
    R3 \= R1, 
    R3 \= R2,
    \+ conflicts(T1,R3,T3),
    \+ conflicts(T2,R1,T1),
    \+ conflicts(T2,R3,T3),
    \+ conflicts(T3,R1,T1),
    \+ conflicts(T3,R2,T2).

between(Low, High, Between) :-
    Between is Low
    ;
    Low < High,
    Next is Low + 1,
    between(Next, High, Between).

对于这个问题有更有效的实现。

我问的另一个问题有这个问题的最新实例:您将找到类似问题的解决方案,并标记为。例如,在SICStus Prolog中,检查
序列化/2
,可在
库(clpfd)
中找到。它是描述这种约束的专用谓词。

?-schedule(R1,T1,R2,T2,R3,T3)
R1 = 1
T1 = 0
R2 = 2
T2 = 400
R3 = 3
T3 = 200