我正在研究一个调度问题,我使用cumulatives/3
进行建模。
例如:
s1(Ss, Es, Ms ) :-
Ss = [S1,S2,S3,S4,S5,S6,S7],
Es = [E1,E2,E3,E4,E5,E6,E7],
Ms = [M1,M2,M3,M4,M5,M6,M7],
domain(Ss, 1, 30),
domain(Es, 1, 30),
domain(Ms, 1, 3),
%task( StartTime, Duration, EndTime, ResourceCons, MachineId)
Tasks = [
task(S1, 6,E1, 1,M1),
task(S2, 6,E2, 1,M2),
task(S3, 3,E3, 1,M3),
task(S4, 7,E4, 1,M4),
task(S5, 5,E5, 1,M5),
task(S6, 8,E6, 1,M6),
task(S7, 4,E7, 1,M7)
],
%machine( Id, ResourceBound ),
Machines = [
machine( 1, 1),
machine( 2, 1),
machine( 3, 1)
],
cumulatives(Tasks, Machines, [bound(upper)] ),
append([Ss,Es,Ms], Vars),
labeling([], Vars).
如果我运行谓词s1/3
,我得到:
| ?- s1(Ss, Es, Ms ).
Es = [7,7,4,11,12,15,15],
Ms = [1,2,3,3,1,2,3],
Ss = [1,1,1,4,7,7,11] ?
yes
| ?-
此示例显示m1在12处完成,m2在15处,m3在15处。
但是,当每台机器完成所有任务时,表达的“最佳”或最佳方式是什么?我想为机器的结束时间添加一些额外的约束。 是否存在适合表达此问题的全局限制?
答案 0 :(得分:1)
这是表达它的一种方式。想到的唯一相关的全局约束是最大/ 2。
| ?- makespans([1,2,3,3,1,2,3], [7,7,4,11,12,15,15], [M1,M2,M3]).
M1 = 12,
M2 = 15,
M3 = 15 ?
% makespans(+Machines, +EndTimes, +MakeSpans) :-
% given N tasks assigned to Machines and finishing at EndTimes,
% the ith element of MakeSpans is unified with the max finish time for task i
% MakeSpans should be a list of the right length
makespans(Machines, EndTimes, MakeSpans) :-
( foreach(Make,MakeSpans),
count(I,1,_),
param(Machines,EndTimes)
do ( foreach(E,EndTimes),
foreach(M,Machines),
foreach(T,Terms),
param(I)
do T #= (M#=I)*E
),
maximum(Make, Terms)
).