MINERVA superseeded IF/Prolog.
Please see
http://www.ifcomputer.co.jp/MINERVA
for details.
We discontinued to sell IF/Prolog Dec 31. 2003.
For current customers, we continue to provide
professional support for IF/Prolog until Dec 31, 2008.
Job | Task | Machine | Duration | Manning
----|------|---------|----------|--------
Ja | Ta1 | M1 | 2 | 3
Ja | Ta2 | M2 | 6 | 2
Jb | Tb1 | M2 | 5 | 2
Jb | Tb2 | M1 | 3 | 3
Jb | Tb3 | M2 | 3 | 2
Jc | Tc | M2 | 4 | 2
Jd | Td1 | M1 | 5 | 4
Jd | Td2 | M2 | 2 | 1
その1の例では、外部の資源は考慮に入っていませんでした。外部の資源は、スケジュールがそのままでうまく進むかどうかに関して大きな影響を与えうります。外部の資源として例えば人間の工数が考えられます。以下では、上の8のタスクについて人的工数を加えた場合でのスケジューリングを考えます。
上は、その1の例で計算されたスケジュールに必要な人的工数です。実際には6人の作業者がいます。作業者は2カ所には上回っています。追加として2人の作業者を増やすことはできますが、これを行えば、より無駄はふえます。
ここで、以前の例で示したcummulative/4 の制約に人的資源を加えてプログラムを変更します。人的資源は越えてはならない全体的な制約であるため、この制約はすべての機械・すべてのスケジュールに適用されねばなりません。
program :- Jobs = [Ja,Jb,Jc,Jd],
M1_Tsk = [Ta1,Tb2,Td1],
M2_Tsk = [Ta2,Tb1,Tb3,Tc,Td2],
M1_Dur = [Da1,Db2,Dd1],
M2_Dur = [Da2,Db1,Db3,Dc,Dd2],
M1_Dur = [2, 3, 5],
M2_Dur = [ 6, 5, 3, 4, 2],
M1_Man = [ 3, 3, 4],
M2_Man = [ 2, 2, 2, 2, 1],
append(M1_Tsk,M2_Tsk,Tasks),
append(M1_Dur,M2_Dur,Durations),
append(M1_Man,M2_Man,Manning),
Tasks in 0..100, Jobs in 0..100, Men = 6,
Ta2 ?>= Ta1 + Da1, Tb2 ?>= Tb1 + Db1,
Td2 ?>= Td1 + Dd1, Tb3 ?>= Tb2 + Db2,
Ja ?= Ta2 + Da2, Jc ?= Tc + Dc,
Jb ?= Tb3 + Db3, Jd ?= Td2 + Dd2,
cumulative(M1_Tsk,M1_Dur,[1,1,1],1),
cumulative(M2_Tsk,M2_Dur,[1,1,1,1,1],2),
cumulative(Tasks,Durations,Manning,Men),
minimize_maximum(label(Tasks),Jobs),
print((Tasks,Durations,Manning,Jobs)).
上記のプログラムを実行すると、以下の結果が得られます。(0.02秒で出ます。)
[user] ?- program.
[0,7,2,5,0,11,10,7],
[2,3,5,6,5,3,4,2], [3,3,4,2,2,2,2,1], [11,14,14,9]
yes
結果のリストは、それぞれ最適化されたスタート時間、所要時間、投入される人的資源、作業完了時間を示します。作業者のスケジュールは以下により明確に図示されます。
人的資源は、明らかにこの例でのスケジュールの方がうまく利用されていますが、もう一つ注意して欲しいことは、これによって作業全体のスケジュールがどのように影響を受けているかという点です。
人的資源については上の例と比較して完了時間をひとつ変えただけですが、これにより全体の作業は非常に効率よくなったと見ることができます。
現実には、作業スケジューリングにおいては、より多くのファクターを考慮に入れねばなりません。人的工数は、休日や病気欠席の人を考慮すると、時に応じて変化します。
機械については、定期点検や、あるタスクをした場合にあるクリーニングを行わねばなりません。定期点検は、スケジューリングを行う前に開始時間と必要所要時間を設定して固定的な制約として、固定的なタスクとして間単にスケジューリングすることができます。所定のタスクの前後に行われるべきクリーニングは、そのタスク内に包括する形で、スケジューリングを行います。
|