调度问题有很多族。我正在研究一个问题,我有一系列工作/任务,从一个家庭过渡到另一个家庭需要重新配置机器(设置时间)。
我正在使用cumulatives[2/3]
来解决这个问题,但我不确定如何表达设置时间。
在这个小例子中,我有 10 个任务属于 3 个不同的家庭。任何任务都可以在任何机器上运行,但是从一个系列中的一个任务切换到另一个系列中的另一个任务需要添加设置时间。
:- use_module(library(clpfd)).
:- use_module(library(lists)).
go( Ss, Es, Ms, Tm, Lab ) :-
Ss = [S1, S2, S3, S4,S5,S6,S7,S8,S9,S10], %Starttimes
Es = [E1, E2, E3, E4,E5,E6,E7,E8,E9,E10], %Endtimeds
Ms = [M1, M2, M3, M4,M5,M6,M7,M8,M9,M10], %MachineIds
domain(Ss, 1, 30),
domain(Es, 1, 30),
domain(Ms, 1, 3 ),
Tasks = [
%Family 1: Setuptime, Su1 = 4,
task( S1, 6, E1, 1, M1 ), %Task T1
task( S2, 6, E2, 1, M2 ), %Task T2
task( S3, 3, E3, 1, M3 ), %Task T3
task( S4, 7, E4, 1, M4 ), %Task T4
%Family 2: Setuptime, Su2 = 3
task( S5, 5, E5, 1, M5 ), %Task T5
task( S6, 8, E6, 1, M6 ), %Task T6
task( S7, 4, E7, 1, M7 ), %Task T7
%Family 3: Setuptime, Su3 = 5
task( S8, 4, E8, 1, M8 ), %Task T8
task( S9, 4, E9, 1, M9 ), %Task T9
task( S10, 5, E10, 1, M10 ) %Task T10
],
%All machines has resource capacity = 1
Machines = [
machine( 1, 1 ), %M1
machine( 2, 1 ), %M2
machine( 3, 1 ) %M3
],
cumulatives(Tasks, Machines, [bound(upper),task_intervals(true)] ),
maximum( MaxEndTime, Es ),
%Make the list of options to pass to the labeling predicate
append( [ [minimize(MaxEndTime)], [time_out( Tm, _)], Lab ], LabOpt ),
Vars=[S1,M1,S2,M2,S3,M3,S4,M4,S5,M5,S6,M6,S7,M7,S8,M8,S9,M9,S10,M10],
labeling( LabOpt, Vars).
一个有效的时间表(但不是最佳的)可能是:
M1: Su1,T1,T2,Su3,T10
M2: Su2,T5,T6,Su3,T8
M3: Su1,T3,T4,Su2,T7,Su3,T9
与使用一起表达这一点的最佳方式是cumulatives[2/3]
什么?通过使每个任务的持续时间成为域变量并为其添加额外的约束?