スケジューリング問題には多くのファミリーがあります。あるファミリから別のファミリへの移行にマシンの再構成 (セットアップ時間) が必要なジョブ/タスクのファミリがある問題を調査しています。
この問題を解決するために使用cumulatives[2/3]
していますが、セットアップ時間をどのように表現できるかわかりません。
この小さな例では、3 つの異なるファミリーに属する 10 個のタスクがあります。どのタスクもどのマシンでも実行できますが、あるファミリーのタスクから別のファミリーの別のタスクに切り替えるには、セットアップ時間を追加する必要があります。
:- 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).
1 つの有効なスケジュール (最適ではない) は次のようになります。
M1: Su1,T1,T2,Su3,T10
M2: Su2,T5,T6,Su3,T8
M3: Su1,T3,T4,Su2,T7,Su3,T9
を使ってこれをどのように表現するのが最善の方法cumulatives[2/3]
ですか? 各タスクの期間をドメイン変数にし、それに追加の制約を追加することによって?