我有这个安排任务的问题。每个任务都有一个建议的开始时间 T(它需要从 [T-10, T+10] 开始),需要 L 分钟才能完成并使用许多资源 [R1, R2,...]。当资源被使用时,没有其他任务可以使用它。鉴于只有开始时间是灵活的,我的目标是安排任务,以便他们可以访问他们需要的任何资源或指出所有需要解决的冲突。
我可以为此目的使用哪种算法?谢谢你。
我有这个安排任务的问题。每个任务都有一个建议的开始时间 T(它需要从 [T-10, T+10] 开始),需要 L 分钟才能完成并使用许多资源 [R1, R2,...]。当资源被使用时,没有其他任务可以使用它。鉴于只有开始时间是灵活的,我的目标是安排任务,以便他们可以访问他们需要的任何资源或指出所有需要解决的冲突。
我可以为此目的使用哪种算法?谢谢你。
由于您已将其标记为prolog
,因此我建议在约束逻辑编程(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具有类似的库。
像这样的调度问题通常最好使用约束编程 CP 或混合整数编程 (MIP) 来解决。两者都是声明式方法,因此您只需要关注问题的属性并让专门的引擎处理底层算法。更多信息可以在维基百科上找到:
如果您受到限制或您的问题域将扩展,您还应该查看不完善的算法,例如:
元启发式算法,例如禁忌搜索和模拟退火。有几个开源实现,例如Drools Planner。
遗传算法,例如 JGap。