【文献】
藤井 進、森田 浩、金田 健一、正岡 良規,時間制約付きプロジェクト計画法,システム/制御/情報,日本,システム制御情報学会,1996年 1月15日,第40巻、第1号,p.34−40
(58)【調査した分野】(Int.Cl.,DB名)
少なくとも一部の期間で重複して進行する複数のプロジェクトの各々について前記プロジェクトを構成する複数のタスクの半順序関係を定義した実行順序データと、前記複数のタスクの遂行時間を定義したタスク遂行時間データと、前記複数のタスクと前記複数のタスクの各々を実行可能な職能タイプとの対応関係を定義した第1の対応関係データと、前記職能タイプと前記タスクを実行する複数のリソースとの対応関係を定義した第2の対応関係データと、に基づいて、前記複数のプロジェクトを構成するタスクのうち未終了のタスクから、着手可能な着手可能タスクを抽出する抽出手段と、
前記複数のリソースのうち前記着手可能タスクを実行可能で且つ他のタスクに未割り当てのリソースを割り当てる割当手段と、
前記複数のプロジェクトの全タスクが終了するまで、予め定めた時間毎に前記割当手段による前記リソースの割り当てが実行されるように制御する制御手段と、
を含み、
前記第1の対応関係データにより定義された前記対応関係は、タスク職能関数によって定義され、前記タスク職能関数は、1つの前記職能タイプに対して複数のタスクを割り当て可能である
スケジューリング装置。
前記複数のプロジェクトの各タスクに対する前記予め定めた時間毎の前記リソースの割り当て結果を示すスケジュール表を生成し、生成したスケジュール表を出力するスケジュール表出力手段
を備えた請求項1〜請求項4の何れか1項に記載のスケジューリング装置。
【発明を実施するための形態】
【0021】
以下、図面を参照して本発明の実施の形態の一例について詳細に説明する。
【0022】
図1には、本実施形態に係るスケジューリング装置10の概略ブロック図を示した。同図に示すように、スケジューリング装置10は、コンピュータ20を含んで構成されていり、例えば一般的なパーソナルコンピュータの構成とすることができる。
【0023】
コンピュータ20は、CPU20A、ROM20B、RAM20C、不揮発性メモリ20D、及び入出力インターフェース(I/O)20Eがバス20Fを介して各々接続された構成となっている。
【0024】
I/O20Eには、キーボードやマウス等を含んで構成された操作部22、液晶ディスプレイ等で構成された表示部24、及び後述する処理の制御プログラム等を記憶するためのハードディスク26等が接続されている。
【0025】
なお、後述する処理の制御プログラムは、本実施形態では一例としてハードディスク26に予め記憶され、CPU20Aがこの予め記憶された制御プログラムを読み込むことにより実行される。また、CD−ROM等の記録媒体に制御プログラムを記録し、これをCD−ROMドライブ等で読み込むことにより実行するようにしてもよい。
【0026】
本実施形態に係るスケジューリング装置10は、少なくとも一部の期間で重複して進行する複数のプロジェクトを構成する複数のタスクに対して、タスクを実行するリソースを割り当てるものである。
【0027】
ここで、プロジェクトは、様々な事業分野において実行される各種の計画が含まれる。例えば建築分野であれば、プロジェクトは、集合住宅の建築における各住戸の建築計画に該当する。この場合、プロジェクトの数は住戸の数に相当し、住戸の数に相当する複数のプロジェクトは並列進行可能である。そして、各プロジェクトには、内装工事、電気工事、ダクト工事、給排水工事等、複数のタスクが含まれる。これらのタスクの実行には、特定の職能を備えたリソース、例えばワーカー(職人、労働者等)が必要となる。例えば内装工や電気工、ダクト工、給排水工等である。本実施形態に係るスケジューリング装置10では、いわゆる集合論を用いて、一例として、上記の職能を有する職人(リソース)を、並列して進行する各住戸の建築(プロジェクト)における各種工事(タスク)に対して効率よく短時間で割り当てる。なお、リソースにはワーカーが含まれ、ワーカーには職人や労働者等が含まれる。
【0028】
また、プロジェクト、タスク、リソースは上記の例に限られない。例えば、医療分野であれば、プロジェクトは、患者の治療計画に該当し、タスクは、内科治療、外科治療等に該当し、リソースは内科医、外科医等に該当する。
【0029】
本実施形態では、プロジェクトの表現を、タスクをノード、タスク間順序を集合論に基づく半順序集合(POS:Partially Ordered Set)で表し、タスク集合を終了タスク集合と未終了タスク集合に分割する。また、未終了集合の極小元集合を着手可能タスク集合とし、それを更に仕掛タスク集合と開始可能タスク集合に分割する。そして、これらのタスク集合の動的変化と、職能とタスクとの関係と、に基づいて、特定の職能を有するワーカーをタスクに動的に割り当てる。
【0031】
本実施形態では、集合論に基づいて、(1)タスク集合、(2)職能集合、(3)タスク職能関係、(4)労働者集合と職能割当関数、(5)ワーカーに対する実行可能タスク集合、(6)タイムカウンター集合とタイムインターバル集合、(7)タスクの推定遂行時間とタスク推定遂行時間割当関数を以下のように定義する。
【0032】
(1)タスク集合:Task Set
各プロジェクトに含まれるタスクの集合であるタスク集合TASKSを一例として以下のように定義する。
TASKS={101, 102, 103,….,Start, End}
【0033】
また、特殊タスクの開始と終了を表すタスク集合StartEndSetを一例として以下のように定義する。
StartEndSet={Start, End }
【0034】
なお、全てのタスク集合は、StartEndSetに含まれる開始のシンボルである最小元Startと終了のシンボルである最大元Endを含む。
【0035】
(2)職能集合:PROFS:Profession Set
ワーカーが有する職能の集合である職能集合PROFSを一例として以下のように定義する。
PROFS={電気工、ダクト工、給排水工、・・・}
【0036】
(3)タスク職能関係:Task Profession Relation:TPR
どのタスクがどの職能によって遂行可能かの割当を表すタスク職能関係TPRを以下のように定義する。
TPR⊆TASKS×PROFS
【0037】
なお、特殊な条件では、1つのタスクは特定の職能でしか実行できないという制限がつく。これをタスク職能関数と呼ぶ(Task Profession Function:TPF)。
【0038】
いずれにせよ特定の職能は一般に複数のタスクを遂行できる。タスク職能関数TPFが1:1関数のときは、1職種に対して1タスクの以下の限定された関係が成り立つ。
TRF:TASKS→PROFS
【0039】
(4)労働者集合と職能割当関数:Profession Assignment Function:ProfAssignF
労働者集合(Worker Set) をΩとする。ワーカー(労働者)はそれぞれ職能を割り当てられるものとし、職能割当関数ProfAssignFを以下のように定義する。
ProfAssignF:Ω→PROFS
【0040】
(5)ワーカーωに対する実行可能タスク集合:POS_TASKS[ω]:Posible Task Set for ω
タスク職能関係の下での、実行可能タスク集合POS_TASKS[ω]を以下のように定義する。
POS_TASKS[ω]={ x | <x,y>∈TPR, y=ProfAssignF(ω)}
【0041】
また、タスク職能関数の下での、実行可能タスク集合POS_TASKS[ω]を以下のように定義する。
POS_TASKS[ω]={ x | x∈TRF-1(y), y=ProfAssignF(ω)}
【0042】
(6)タイムカウンター集合:TimeCounter={0,1,2,…}とタイムインターバル集合TimeInterval
本実施形態では、0を含む自然数でタイムカウンター集合とタイムインターバル集合を定義する。
【0043】
(7)タスクの推定遂行時間:EstTimeAcomp:Estimated Time for Accomplishmentと、タスクへの推定遂行時間割当て関数:EstTimeAcompF:Estimated Time for Task Accomplishment Function
【0044】
本実施形態では、タスク毎に標準の推定遂行時間EstTimeAcompがタイムインターバル集合TimeIntervalへのタスク推定遂行時間割当て関数EstTimeAcompFとして定義される。
EstTimeAcompF:TASKS→TimeInterval
【0045】
なお、本実施形態では、タイムインターバル集合TimeIntervalは0を含む自然数とする。
【0046】
<プロジェクトの定義と極小元集合>
本実施形態では、(1)プロジェクト、(2)終了タスク集合、未終了タスク集合、着手可能集合を以下のように定義する。
【0047】
(1)プロジェクト:タスク集合
タスク集合TASKSに半順序関係を定義したプロジェクトPを以下のように定義する。
P=(TASKS,<)
ただし、プロジェクトPは最小元Startと最大元Endを持つ。
【0048】
例えば、以下のようなタスク集合TASKSを定義する。なお、数字の本来の大小はここでは関係ない。
TASKS={Start,1,2,3,4,5,6,7,End}
【0049】
そして、各タスクに以下のような関係があるものとする。Start<1,Start<2,1<3,2<3,3<4,3<5,4<6,5<7,6<7,7<End
【0050】
この場合、各タスクの関係は以下のように表せる。
【0051】
5 → → → 7 → E
↑ ↑
S → 1 → 3 → 4 → 6
↓→ 2→ ↑
【0052】
これは、ノードをタスク集合の元、アークを半順序関係と見なせばグラフ表現となるが、しばしば用いられるタスクをアークとした表現ではない。
【0053】
(2)終了タスク集合、未終了タスク集合、着手可能タスク集合
プロジェクトP=(TASKS,<)に対して、終了タスク集合Finished Task Set:Fin_TASKS[P]、未終了タスク集合Unfinished Task Set:UFin_TASKS[P]を以下のように定義する。
Fin_TASKS[P]⊆TASKS-{Start}
UFin_TASKS[P]⊆TASKS-{Start}
【0054】
ただし、終了タスク集合Fin_TASKS[P]、未終了タスク集合UFin_TASKS[P]には最小元Startは入らないものとする。また、終了タスク集合Fin_TASKS[P]、未終了タスク集合UFin_TASKS[P]に対して以下が成り立つ。
Fin_TASKS[P] ∩ UFin_TASKS[P]=φ
Fin_TASKS[P] ∪ UFin_TASKS[P]=TASKS-{Start}
【0055】
また、着手可能タスク集合Able to Begin Task Set:ABegin_TASKS[P]を以下のように定義する。
ABegin_TASKS[P]⊆UFin_TASKS[P]
ABegin_TASKS[P]={x | ∀y∈UFin_TASKS[P] y<x→y=x, x∈UFin_TASKS[P]}
【0056】
すなわち、着手可能タスク集合は、未終了タスク集合の極小元の集合となる。
【0057】
また、仕掛タスク集合Task In Process Set:TaskInProgS[P]をプロジェクトPの着手可能タスク集合ABegin_TASKS[P]の部分集合と捉え、これにより着手中の仕掛タスク集合を定義する。すなわち、仕掛タスク集合TaskInProgS[P]は以下のように定義される。
TaskInProgS[P]⊆ABegin_TASKS[P]
【0058】
これらの定義から、タスクは以下のように進行する。すなわち、未終了タスク集合から、その極小元集合が着手可能タスク集合として求められ、その着手可能タスク集合のうち、リソースの割当てが行われたタスクについては、仕掛タスク集合と認識される。ただしもとの着手可能タスク集合は未終了タスク集合の極小元の集合なので、一部が仕掛タスクと認識されても、それ自体はタスクが終了しない限り変化しない。その意味では、実際に作業中でない開始可能タスク集合を開始可能タスク集合として把握しておく必要がある。
【0059】
また、開始可能タスク集合Startable Task Set:StartTaskS[P]を以下のように定義する。
StartTaskS[P]=ABegin_TASKS[P]-TaskInProgS[P]
【0060】
ここで、一つのプロジェクトの中である時点で開始可能なタスクは開始可能タスク集合StartTaskS[P]に含まれ、開始中であるが未終了の仕掛タスクは 仕掛タスク集合TaskInProgS[P]に含まれる。
【0061】
また、終了したタスクは、終了タスク集合Fin_TASKS[P]へと移り、次の未終了タスク集合UFin_TASKS[P]とそれに応じた着手可能タスク集合ABegin_TASKS[P]が計算される。これらは何れもタスク集合が有限集合であることから容易に求められる。
【0062】
図2には、集合論により表現された各タスク集合及びリソース(労働者)の割当の概念図を示した。
【0063】
(3)サブプロジェクト(Y,<)
P=(X,<)をプロジェクト、Xはそのタスク集合とする。この場合、任意のタスク集合の部分集合Y⊆Xに対して、そこに制限されたプロジェクト(Y,<)が定義される。これをP=(X,<)のサブプロジェクトと呼ぶ。
【0064】
(4)プロジェクト進行:Project Progress at Time t:ProjProg[P](t)
プロジェクトP=(X,<)に対する時間tでのプロジェクト進行ProjProg[P](t)は次の集合時間関数の組みで示される。
ProjProg[P](t)=(X,Fin_TASKS[P](t),UFin_TASKS[P](t),ABegin_TASKS[P](t),TaskInProgS[P](t),StartTaskS[P](t))
ただし、
ProjProg[P](0)=(X,φ,X-{Start},ABegin_TASKS[P](0),φ,StartTaskS[P](0))
となる。また、上記の定義から、
StartTaskS[P](0)=ABegin_TASKS[P](0)、かつ
ABegin_TASKS[P](0)={x | ∀y∈X-{Start} y<x→y=x, x∈X-{Start}}
となる。
【0065】
<プロジェクト集合とプロジェクト集合に対するタスク割当て>
ここでは、単一のプロジェクトではなく、プロジェクトの集合に対して、終了タスク集合、未終了タスク集合、着手可能タスク集合、仕掛タスク集合、開始可能タスク集合を定義する。なお、ワーカω∈Ωの実行可能タスク集合:POS_TASKS[ω]は既に定義した。
【0066】
(1)プロジェクト集合:ProS
プロジェクトを有限個集めた集合をプロジェクト集合Prosとして以下のように定義する。
ProS={P1,P2,…,Pn}
【0067】
(2)プロジェクト集合に対する終了タスク集合、未終了タスク集合、着手可能タスク集合
プロジェクト集合ProSに対して、単一のプロジェクトに対して定義した、終了タスク集合、未終了タスク集合、着手可能タスク集合を、プロジェクト集合からタスク集合への集合関数として以下のように定義する。
【0068】
まず、プロジェクト集合に対する終了タスク集合:Finished Task Set for Project Set:Fin_TASKS[ProS]を以下のように定義する。
Fin_TASKS[ProS]={ h | h:ProS→{ Fin_TASKS[P] | P∈ProS}
ここで、h(P)=Fin_TASKS[P]である。
【0069】
同様に、未終了タスク集合、着手可能タスク集合も以下のように定義される。
【0070】
プロジェクト集合に対する未終了タスク集合:Unfinished Task Set for Project Set:UFin_TASKS[ProS]を以下のように定義する。
UFin_TASKS[ProS]={ h | h:ProS→{ UFin_TASKS[P] | P∈ProS}
【0071】
ここで、h(P)=UFin_TASKS[P]が上記と同様に集合関数として定義される。なお、終了タスク集合、未終了タスク集合には最小元Startは入らないものとする。
【0072】
また、それぞれのプロジェクトのタスク名は、
Fin_TASKS[P] ∩ UFin_TASKS[P]=φ for any P∈ProS
Fin_TASKS[P] ∪ UFin_TASKS[P]=TASKS[P]-{Start} for any P∈ProS
となる。ただし、(TASKS[P],<)=Pとする。
【0073】
なお、複数のプロジェクトでタスクを区別して割り当てるために、プロジェクトからの集合関数という形で例えば以下のように割り当てることとする。
h(P1)={基本墨出し}
h(P2)={基本墨出し, 排水配管, SP配管, UB組立}
h(P3)={基本墨出し, 排水配管}
【0074】
また、プロジェクト集合に対する着手可能タスク集合:Able to Begin Task Set:ABegin_TASKS[ProS]を以下のように定義する。
ABegin_TASKS[ProS]⊆UFin_TASKS[ProS]
ABegin_TASKS[ProS]={ h | h:ProS→{ ABegin_TASKS[P] | P∈ProS}
ここで、h(P)=ABegin_TASKS[P]である。
ただし、
ABegin_TASKS[P]={x | ∀y∈UFin_TASKS[P] y<x→y=x, x∈UFin_TASKS[P]}
である。すなわち、プロジェクト集合Prosに対する着手可能タスク集合ABegin_TASKS[ProS]は、未終了タスク集合UFin_TASKS[ProS]の極小元の集合をプロジェクト毎に割り当てる集合関数として与えられる。
【0075】
また、プロジェクト集合に対する仕掛タスク集合:Task In Process Set for Project Set:TaskInProgS[ProS]をプロジェクトPから仕掛タスク集合に対する集合関数として以下のように定義する。
TaskInProgS[ProS]={ h | h:ProS→{ TaskInProgS[P] | P∈ProS}
ここで、h(P)=TaskInProgS[P]である。
また、∀P∈ProS、TaskInProgS[P]⊆ABegin_TASKS[P]が成り立つ。
【0076】
また、プロジェクト集合に対する開始可能タスク集合:Startable Task Set for Project Set:StartTaskS[ProS]をプロジェクトPから開始可能タスク集合に対する集合関数として以下のように定義する。
StartTaskS[ProS]={ h | h:ProS→{ StartTaskS[P] | P∈ProS}
【0077】
これは離散時間システムではそれぞれの集合の計算の順序によって異なるが、それぞれのプロジェクトPについて、開始可能タスク集合StartTaskS[P]は、その時点で着手可能タスク集合にワーカーを割り当てて、仕掛タスク集合を計算し、これを差し引いた集合となる。
【0078】
<プロジェクトとプロジェクト集合への資源の割付け>
【0079】
ここでは、タスク職能関係と、ワーカー(例えば人)への職能割当関数POS_TASKS[ω]を用いて、個々のワーカーに対してタスクを割り当てることにより、プロジェクトへの人の割付を行うための枠組みを定式化する。ある時点t∈TimeCounter={0,1,2,…}の各々において、未終了タスク集合を計算し、そこから着手可能タスク集合を求め、それに対して仕事が割り当てられていないワーカーを割り当てる。これによって、仕掛タスク集合が計算され、その時点での残りの開始可能タスク集合も求まる。
【0080】
そして、次の時点では、終了タスクや仕掛タスクを除いた新たな未終了タスク集合を計算する。
【0081】
(1)プロジェクトとプロジェクト集合へのタスク割当て
プロジェクト進行:Project Progress at Time t:ProjProg[P](t)を以下のように定義する。
【0082】
プロジェクトP=(X,<)に対する時間tでのプロジェクト進行Project Progress at Time t:ProjProg[P](t)は、(タスク集合X、終了タスク集合、未終了タスク集合、着手可能タスク集合、仕掛タスク集合、)からなる集合時間関数の組みとして以下のように定義される。
ProjProg[P](t)=(X,Fin_TASKS[P](t),UFin_TASKS[P](t),ABegin_TASKS[P](t),TaskInProgS[P](t),StartTaskS[P](t))
ただし、t=0、すなわち初期時点においては、
ProjProg[P](0)=(X,φ,X-{Start},ABegin_TASKS[P](0),φ,StartTaskS[P](0))
となる。また、上記の定義より、
StartTaskS[P](0)=ABegin_TASKS[P](0)、かつ
ABegin_TASKS[P](0)={x | ∀y∈X-{Start} y<x→y=x, x∈X-{Start}}
である。
【0083】
(2)未割当労働者集合Ω[u]と割当済み労働者集合Ω[a]
未割当労働者集合Ω[u]と割当済み労働者集合Ω[a]については以下のような関係が成り立つ。
Ω(t)=Ω[u](t) ∪ Ω[a](t)
Ω[u] ∩ Ω[a]=φ
Ω[u](0)=Ω
Ω[a](0)=φ
【0084】
(3)ある時点tでのプロジェクトPのタスクへの実行可能労働者集合割当関数:AssinableWorkers[P](a)
プロジェクトPのタスクへの実行可能労働者集合割当関数AssinableWorkers[P]は、以下のように定義される。
AssinableWorkers[P]:ABegin_TASKS[P]→Power(Ω[u](t))
ただし、P∈ProS、a∈ABegin_TASKS[P]のとき、
AssinableWorkers:ABegin_TASKS[P]→Power(Ω)
である。これは、ワーカーの集合をタスクに割り当てる集合関数であり、着手可能タスク集合に含まれるタスクに対して、そのタスクを実行可能な職能を持つワーカーを割当可能労働者集合から集めた集合を割り当てる集合関数である。また、
AssinableWorkers[P](a)={ω| a∈POS_TASKS[ω] | ω∈Ω[u] }、a∈ABegin_TASKS[P]
である。この割当集合が空であれば、タスク割当はできない。そのときはワーカーの集合としてφ(空集合)を割り当てるものとする。一般にタスクに必ずワーカーの集合が割り当てられる保証はなく、AssinableWorkers[a]=φ、つまりそのタスクを実行するワーカーの集合を割当できないタスクが存在する可能性がある。ここで、実行可能労働者集合割当関数AssinableWorkers[P](a)は、ワーカーにタスクを割り当てるのではなく、タスクにそれを遂行できる未割当のワーカーの集合を割り当てる集合関数となっている。
【0085】
(4)担当労働者割当関数(Worker in Charge):WinCh
着手可能タスクABegin_TASKS[P]の各々に対して、割当可能労働者集合が割り当てられているとして、そこから実際に担当労働者(ワーカー)を割り当てる担当労働者割当関数(Worker in Charge):WinChを以下のように定義する。
WinCh[P]:ABegin_TASKS[P]→Ω[u]、P∈ProS
ここで担当労働者割当関数WinChは、次の条件を満たすものとする。
∀P,Q∈ProS ∀a∈ABegin_TASKS[P] ∀b∈ABegin_TASKS[Q] ∃ω∈Ω[u] WinCh[P](a)=WinCh[Q](b)=ω then P=Q & a=b
【0086】
すなわち、担当労働者割当関数WinChでは、異なるプロジェクトあるいは異なるタスクに対して同一のワーカーが割り当てられることはないという条件を満たすものとする。
【0087】
このような条件を満たす担当労働者割当関数WinCh[P]を定めることが、具体的に各時点でのワーカー(担当労働者)の担当タスクの割当を行う事に相当する。なお、この担当労働者割当関数WinCh[P]は、唯一に決まるものではなく、様々な割当法があり、割当法によってプロジェクトの進行速度や効率に大きな差がでる。
【0088】
(5)最小人数最長工程単能工優先割当法
次に、プロジェクトの担当労働者を割り当てる担当労働者割当関数WinCh[P]の具体例について説明する。
【0089】
まず、有限個のプロジェクトP∈ProSがあるとする。そして、
AssinableWorkers[P]:ABegin_TASKS[P]→Power(Ω)
によって求められた、AssinableWorkers[P](a)、a∈ABegin_TASKS[P]に含まれるワーカーの人数を、|AssinableWorkers[P](a)|で表す。
【0090】
このとき、プロジェクトPi毎に、タスクa∈ABegin_TASKS[P]は割当可能労働者集合のサイズ、|AssinableWorkers[P](a)|が1のものから順に整列することができる。サイズがゼロ、すなわち担当労働者のいない割当可能労働者集合を持つタスクは、その時点での割当計算からは除外する。更に、割当可能労働者集合はP∈ProSについても併せて整列することができる。例えば、以下のようにサイズが1のものから順に整列することができる。
サイズ1:AssinableWorkers[P2](a3)、a3∈ABegin_TASKS[P2]、かつ、|AssinableWorkers[P2](a3)|=1
サイズ1:AssinableWorkers[P1](a2)、かつ、|AssinableWorkers[P1](a2)|=1
サイズ2:、、、、
このとき、割当可能労働者集合のサイズの小さい順で、かつ同じサイズの割当可能労働者集合については、そのタスクの遂行時間の長いタスクから、タスクにワーカーを割り当てるタスクへの担当労働者の割付方法を、本実施形態では最小人数最長工程優先割当法と呼ぶ。この最少人数最長工程優先割当法のアルゴリズムは以下のようになる。
【0091】
(i)まず、サイズが1の割当可能労働者集合を持つタスクから最長のタスクの実行時間のプロジェクトPとタスクaを選んで、これに割当可能労働者集合AssinableWorkers[P](a)の中から(長さ1の場合は一人しかワーカーは含まれない)、ワーカーを割り当てる。
【0092】
(ii)(i)でサイズが1のタスクがないときは、サイズが2の割当可能労働者集合について割当を行う。このとき、2人以上のワーカーがいるときには、1つの職能を有する単能工のワーカーを優先して割り当てる。条件が同じ場合には、確率的に一人のワーカーを選択する。
【0093】
(iii)一人のワーカーの割当が終了すると、割当可能労働者集合が変化するので、それを再計算して、改めて、(i)のワーカーの割当を行う。
【0094】
(iv)ワーカーを割り付けるべきタスクがなくなるか、あるいはタスクに割り当てるワーカーがなくなるまで上記の割り当てを行う。
【0095】
<タスクとプロジェクトの小さな抽象事例>
【0096】
以下では、7つのタスクと4つの職能、10人のワーカーのケースにおけるワーカーの割当の具体例について説明する。
【0097】
(1)タスク集合、職能集合、タスク職能関数、労働者集合と職能割当て関数、ワーカーに対する実行可能タスク集合、タスクの推定遂行時間割当
【0098】
(i)タスク集合:Task Setとプロジェクト
7つのタスクを有するタスク集合TASKSは以下のように定義される。
TASKS={Start,1,2,3,4,5,6,7,End}
【0099】
そして、各タスクには、実行順序に関して以下のような関係があるものとする。Start<1,Start<2,1<3,2<3,3<4,3<5,4<6,5<7,6<7,7<End
【0100】
この場合、各タスクの関係(実行順序)は以下のように表せる。
【0101】
5 → → → 7 → E
↑ ↑
S → 1 → 3 → 4 → 6
↓→ 2→ ↑
【0102】
(ii)職能集合Profession Set:PROFS
4つの職能を有する職能集合PROFSは、以下のように定義される。
PROFS={α,β,γ,δ}
【0103】
(iii)タスク職能関数:TRF:TASKS→PROFS
タスク職能関数TRFは、タスク1〜7に対して、以下のように職能を割り当てる。
TRF(1)=α,TRF(2)=β,TRF(3)=α,TRF(4)=γ,TRF(5)=δ,TRF(6)=δ,TRF(7)=γ
【0104】
(iv)労働者集合と職能割当関数:Profession Assignment Function:ProfAssignF
労働者集合Ωが10人のワーカーで構成される場合、以下のように定義される。
Ω={w1,w2,w3,w4,w5,w6,w7,w8,w9,w10}
【0105】
そして、職能割当関数ProfAssignFは、労働者集合Ωの各ワーカーに対して、以下のように職能を割り当てる。なお、各ワーカーには予め職能が割り当てられる。
ProfAssignF:Ω→PROFS
ProfAssignF(w1)=ProfAssignF(w2)=α
ProfAssignF(w3)=ProfAssignF(w4)=ProfAssignF(w5)=β
ProfAssignF(w6)=γ
ProfAssignF(w7)=ProfAssignF(w8)=ProfAssignF(w9)=ProfAssignF(w10)=δ
【0106】
(v)ワーカーωに対する実行可能タスク集合:POS_TASKS[ω]:Posible Task Set for ω
上記のように各ワーカーに対して職能が割り当てられると、各ワーカーに対する実行可能タスク集合POS_TASKS[ω]は、以下のようになる。
POS_TASKS[w1]=POS_TASKS[w2]={1,3},
POS_TASKS[w3]=POS_TASKS[w4]=POS_TASKS[w5]={2},
POS_TASKS[w6]={4,7},
POS_TASKS[w7]=POS_TASKS[w8]=POS_TASKS[w9]=POS_TASKS[w10]={5,6}
【0107】
(vi)タイムカウンター集合とタイムインターバル集合
タイムカウンター集合はTimeCounter={0,1,2,…}、タイムインターバル集合はTimeIntervalと定義する。
【0108】
(vii)タスクの推定遂行時間割当て関数:EstTimeAcompF:TASKS→TimeInterval
推定遂行時間割当関数EstTimeAcompFは、各タスクに対して、推定遂行時間を以下のように与える。
EstTimeAcompF(1)=3,
EstTimeAcompF(2)=5,
EstTimeAcompF(3)=1,
EstTimeAcompF(4)=7,
EstTimeAcompF(5)=2,
EstTimeAcompF(6)=10,
EstTimeAcompF(7)=5
【0109】
(2)終了タスク集合、未終了タスク集合、着手可能タスク集合、ワーカー割当計算
(i)終了タスク集合、未終了タスク集合、着手可能タスク集合、仕掛タスク集合、開始可能タスク集合
ある時点tにおける終了タスク集合、未終了タスク集合、着手可能タスク集合、仕掛タスク集合、開始可能タスク集合は以下のように定義される。
終了タスク集合:Finished Task Set:Fin_TASKS[P](t)
未終了タスク集合:Unfinished Task Set:UFin_TASKS[P](t)
着手可能タスク集合:ABegin_TASKS[P](t)
仕掛タスク集合:TaskInProgS[P](t)
開始可能タスク集合:StartTaskS[P](t)
【0110】
プロジェクトP=(X,<)に対する時間tでのプロジェクト進行ProjProg[P](t)は以下のように表される。
【0111】
プロジェクト進行:ProjProg[P](t)=(X,Fin_TASKS[P](t),UFin_TASKS[P](t),ABegin_TASKS[P](t),TaskInProgS[P](t),StartTaskS[P](t))
【0112】
(ii)初期(t=0)での計算
t=0の初期時点では、終了タスク集合Fin_TASKS[P](0)、未終了タスク集合UFin_TASKS[P](0)、着手可能タスク集合ABegin_TASKS[P](0)、仕掛タスク集合TaskInProgS[P](0)、開始可能タスク集合StartTaskS[P](0)、プロジェクト進行ProjProg[P](t)は以下のようになる。
Fin_TASKS[P](0)=空集合
UFin_TASKS[P](0)={1,2,3,4,5,6,7,End}
ABegin_TASKS[P](0)={1,2}
TaskInProgS[P](0)=空集合
StartTaskS[P](0)={1,2,3,4,5,6,7,End}
ProjProg[P](t)=({Start,1,2,3,4,5,6,7,End},φ,{1,2,3,4,5,6,7,End},{1,2},φ,{1,2,3,4,5,6,7,End}}
【0113】
(iii)第1期(t=1)での計算
第1期の最初(のステージ)でタスクが開始される。このため、t=1の初期時点では、終了タスク集合Fin_TASKS[P](1)、未終了タスク集合UFin_TASKS[P](1)、着手可能タスク集合ABegin_TASKS[P](1)、仕掛タスク集合TaskInProgS[P](1)、開始可能タスク集合StartTaskS[P](1)、プロジェクト進行ProjProg[P](t)はt=0の場合と同様となる。
【0114】
(iv)第k期(t=k)での計算
第k期の最初(のステージ)で、終了タスクが計算され、終了したタスクは、終了タスク集合へと移り、次の未終了タスク集合とそれに応じた着手可能タスク集合が計算される。そして、新たに計算された着手可能タスク集合のタスクに対してワーカーが割り当てられる。
【0115】
以下、スケジューリング装置10のCPU20Aで実行される処理について、
図3に示すフローチャートを参照して説明する。
【0116】
ステップ100では、プロジェク集合Pros、各プロジェクトのタスク集合TASKSを前述のように定義すると共に、定義された各タスクの実行順序を定義する。これは、例えばユーザーが操作部22を操作して入力することにより定義することができる。なお、以下の各種集合や関数の定義についても同様である。
【0117】
ステップ102では、職能集合PROFS、タスク職能関係TPR又はタスク職能関数TPFを前述のように定義する。
【0118】
ステップ104では、労働者集合Ωと職能割当関数ProfAssignFを前述のように定義する。
【0119】
ステップ106では、実行可能タスク集合POS_TASKS[ω]を例えばタスク職能関係TPR、労働者集合Ω、及び職能割当関数ProfAssignFに基づいて求める。
【0120】
ステップ108では、タイムカウンター集合TimeCounterとタイムインターバル集合TimeIntervalを前述のように定義する。
【0121】
ステップ110では、タスク推定遂行時間割当関数EstTimeAcompFを前述のように定義する。
【0122】
ステップ112では、未割当労働者集合Ω[u]と割当済み労働者集合Ω[a]を前述のように定義する。
【0123】
ステップ114では、時間変数tを0に初期化する。
【0124】
ステップ116では、タスク集合X、終了タスク集合Fin_TASKS[P](t)、未終了タスク集合UFin_TASKS[P](t)、着手可能タスク集合ABegin_TASKS[P](t)、仕掛タスク集合TaskInProgS[P](t)、開始可能タスク集合StartTaskS[P](t)を含むプロジェクト進行ProjProg[P](t)を前述のように定義する。
【0125】
ステップ118では、プロジェクト進行ProjProg[P](t)のうち着手可能タスク集合ABegin_TASKS[P](t)に属する着手可能タスクに対して、実行可能労働者集合割当関数AssinableWorkers[P]、担当労働者割当関数WinChにより、未割当労働者集合Ω[u] (t)からワーカーを割り当てる。この割当は、例えば前述したように最小人数最長工程単能工優先割当法により割り当てる。
【0126】
ステップ120では、未割当労働者集合Ω[u]と割当済み労働者集合Ω[a]を更新する。
【0127】
ステップ122では、着手可能タスクに対するワーカーの割り当てが終了したか否かを判断する。ここで、着手可能タスクに対するワーカーの割り当てが終了する場合とは、全ての着手可能タスクに対してワーカーが割り当てられた場合や、着手可能タスクに対して割り当てるべきワーカーが存在しない場合である。そして、着手可能タスクに対するワーカーの割り当てが終了した場合には、ステップ124へ移行する。一方、割り当てが終了していない場合には、ステップ118へ移行し、上記と同様にワーカーが割り当てられていない着手可能タスクに対してワーカーを割り当てる。
【0128】
ステップ124では、時間変数tを1インクリメントする。例えば単位が日であれば、tを1インクリメントさせるとタスクの実行が1日進行したことになる。
【0129】
ステップ126では、終了タスク集合Fin_TASKS[P](t)、未終了タスク集合UFin_TASKS[P](t)、着手可能タスク集合ABegin_TASKS[P](t)、仕掛タスク集合TaskInProgS[P](t)、開始可能タスク集合StartTaskS[P](t)を更新する。例えば、タスク推定遂行時間割当関数EstTimeAcompFにより算出された各タスクの推定遂行時間に基づき、時点tにおいて終了したタスクは終了タスク集合に移動する。また、未終了タスク集合のうち着手可能となったタスクは、着手可能タスク集合に移動する。
【0130】
ステップ128では、全タスクの実行が終了したか否か、すなわち、終了タスク集合に全てのタスクが移動したか否かを判断する。そして、全タスクが終了した場合にはステップ130へ移行し、実行されていないタスクが存在する場合には、ステップ118へ戻って全タスクの実行が終了するまで上記と同様の処理を繰り返す。
【0131】
ステップ130では、各プロジェクトの各タスクに対して、各時点においてどのようにワーカーが割り当てられたかを示すスケジュール表のデータを出力先に出力する。出力先としては、例えば表示部24やハードディスク26等がある。
【0132】
なお、スケジュール表としては、例えば後述する
図19〜22に示すようなスケジュール表を生成して出力することができる。
図19に示すように、複数のプロジェクトの各タスクに対する日毎のワーカーの割り当て結果を示すスケジュール表を生成し、生成したスケジュール表を表示部24等に出力してもよいが、
図20に示すように、
図19に示すスケジュール表を、複数のワーカーの各々に対する日毎のタスクの割り当て結果を示すスケジュール表に並び替えて出力するようにしてもよい。
【0133】
本実施形態では、上記のようにして並列して進行する複数のプロジェクトを構成する複数のタスクに対してワーカーを割り当てるので、例えば製造ラインや建築工事で用いられる一般的なマスター工程やタクト工程に代表される、全順序的な単一プロジェクトを支援するスケジューリング手法では対処できない半順序構造のプロジェクトが並列して進行する工程のリソースの割当に関するスケジューリングの問題を解決することができる。
【0134】
例えば、行為者の行動の蓄積というボトムアップ型と称されるスケジューリング手法である、マルチエージェントシステム等を用いた分散型プロセスのスケジューリング支援手法と比較して、割当アルゴリズムを用いて開始可能タスク集合に対して未割当労働者集合を一義的に割り当てるため、プログラム処理数が少なくなり、より早く結果を導出できる。また、各時点で着手可能なタスクの集合が計算でき、その中の開始可能なタスクの集合を計算し、それに対する割当可能なワーカーを計算により求め、割当アルゴリズムを用いてタスクにワーカーを割り当てることで、半順序構造を持つプロジェクトの各タスクに対するリソースの割り当ての自動演算をより早く行なうことができる。
【0136】
以下では、プロジェクト進行の具体例について説明する。ここでは、3つのプロジェクトP1、P2、P3、4つのタスクa、b、c、d、3つの職種TypeA、TypeB、TypeC、3人のワーカーW1、W2、W3である場合におけるプロジェクト進行の具体例について説明する。
【0137】
本実施形態では、ワーカー等の資源の側が、プロジェクトを構成するタスクに動的に寄付く形で割り付けられるスケジューリングを扱う。これを、本実施形態では資源寄り付き型動的スケジューリング(Resource Approaching Dynamical Scheduling)と呼ぶ。
【0138】
(1)タスク集合:Task Set
プロジェクト集合PS、タスク集合TASKS等は以下のように定義される。
PS={P1,P2,P3}
TASKS[P1]=TASKS[P2]=TASKS[P3]={a,b,c,d}
StartEndSet={Start, End }
【0139】
上記のように、各プロジェクトP1、P2、P3は全て同一のタスクを有する。このように全て同一のタスクを有するプロジェクトの例としては、例えば集合住宅の各住戸の建設等があるが、プロジェクトの種類はこれに限られるものではない。
【0140】
(2)職能集合:PROFS:Profession Set
職能集合PROFSは以下のように定義される。
PROFS={TypeA, TypeB, TypeC}
【0141】
(3)タスク職能関係 Task Profession Relation:TPR)
タスク職能関係TPRは以下のように定義される。
TPR⊆TASKS×PROFS
【0142】
図4には、タスク、職能、及びワーカー(労働者)との関係の概念を示した。同図に示すように、タスクと職能との関係、職能とワーカーとの関係は、何れも多対多の関係にある。
【0143】
(4)労働者集合と職能割当関数: Profession Assignment Function:ProfAssignF
Ωを労働者集合(Worker Set)として、職能割当関数ProfAssignFは以下のように各ワーカーに対して職能を定義する。なお、各ワーカーには、予め職能が割り当てられている。
ProfAssignF:Ω→PROFS
ProfAssignF(W1)=TypeA
ProfAssignF(W2)=TypeB
ProfAssignF(W3)=TypeC
【0144】
(5)ワーカーWに対する実行可能タスク集合:POS_TASKS[W]:Posible Task Set for W
各ワーカーに対する実行可能タスク集合POS_TASKSは以下のようになる。
POS_TASKS[W1]={a}
POS_TASKS[W2]={b,c}
POS_TASKS[W3]={c,d}
【0145】
(6)タスクの推定遂行時間割当て関数: EstTimeAcompF:Estimated Time for Task
タスクの推定遂行時間割当関数EstTimeAcompFは、各タスクに対して推定遂行時間を以下のように割り当てる。なお、ここでは、単位は日である。すなわち、タスクaの推定遂行時間は1日、タスクbの推定遂行時間は2日、タスクcの推定遂行時間は4日、タスクdの推定遂行時間は1日である。
EstTimeAcompF(a)=1
EstTimeAcompF(b)=2
EstTimeAcompF(c)=4
EstTimeAcompF(d)=1
【0146】
(7)プロジェクト進行のグラフ表現
図5には、各プロジェクトの進行をグラフ表現した。同図の“s”はStartを示している。また、各ノードはタスクを示し、例えば“a[P1]/1日”は、プロジェクトP1のタスクaは推定遂行時間が1日であることを示している。
【0147】
本実施形態では、各プロジェクトP1、P2、P3は同一のタスク集合であり、
図5に示すような進行で実行される。すなわち、タスクa、b、c、dには、a<b、a<c、b<d、c<dの順序関係がある。このように各プロジェクトが同一のタスク集合となるものとしては、集合住宅の建築等がある。
【0148】
図5に示すように、各プロジェクトのクリティカルパスはタスクcを経由する下側のルートであり、6日が最短工程となる。
【0149】
以下では、着手可能タスク集合をプロジェクト毎に、その半順序集合の極小元の集合として求める。
図6に示すように、t=0(ゼロ日目)の初期時点では、最初の着手可能タスク集合を求める。
【0150】
同図において、点線内のタスクa[P1]、a[P2]、a[P3]が着手可能タスク集合となる。すなわち、着手可能タスクABegin_TASKS[P1]、ABegin_TASKS[P2]、ABegin_TASKS[P3]は以下のようになる。
ABegin_TASKS[P1]={a[P1]}
ABegin_TASKS[P2]={a[P2]}
ABegin_TASKS[P3]={a[P3]}
【0151】
ここで、労働者集合をΩ[u](0)=Ω={W1,W2,W3}とすると、実行可能労働者集合割当関数AssinableWorkersは、各着手可能タスクに対して以下のようにワーカーを割り当てる。
AssinableWorkers[P1](a[P1])={W1}
AssinableWorkers[P2](a[P2])={W1}
AssinableWorkers[P3](a[P3])={W1}
【0152】
このように、タスクaはワーカーW1しか実行できないので、各プロジェクトの着手可能タスクの実行可能労働者集合はワーカーW1のみとなる。そして、ワーカーはW1,W2,W3の3人しかいないので、前述した最小人数最長工程単能工優先割当法で担当者を割り付ける。この場合、各プロジェクトの着手可能タスクに割り当てられた実行可能労働者集合のサイズは以下のようになる。
|AssinableWorkers[P1](a[P1])|=1
|AssinableWorkers[P2](a[P2])|=1
|AssinableWorkers[P3](a[P3])|=1
【0153】
このように、各プロジェクトの着手可能タスクに割り当てられた実行可能労働者集合のサイズは全て1となるので、ここでjは確率的にプロジェクトP1のタスクa[P1]に対してワーカーW1を割り付ける。
【0154】
次に、
図7に示すように、1日目にタスクa[P1]がワーカーW1により実行され、1日目が終了すると、ワーカーW1は解放される。これにより、
図8に示すように、2日目にはタスクa[P1]は終了タスク(図中‘F'で示す)となる。
【0155】
また、1日目の終了後、次にワーカーを割当可能となる着手可能タスクは、
図7において点線で示したタスクタスクa[P2]、a[P3]、b[P1]、c[P1]となる。
【0156】
これらの着手可能タスクに対して上記と同様にワーカーの割当を行う。すなわち、実行可能労働者集合割当関数AssinableWorkersは、各着手可能タスクに対して以下のようにワーカーを割り当てる。
AssinableWorkers[P2](a[P2])={W1}
AssinableWorkers[P3](a[P3])={W1}
AssinableWorkers[P1](b[P1])={W2}
AssinableWorkers[P1](c[P1])={W2,W3}
【0157】
ここでも、前述した最小人数最長工程単能工優先割当法により、タスクa[P2]にW1が割り当てられ、次に工期が4日のタスクc[P1]に単能工のワーカーW3が割り当てられ、最後にタスクb[P1]にワーカーW2が割り当てられる。
【0158】
これにより、
図8に示すように、2日目には、タスクb[P1]、c[P1]、a[P2]が実行され、2日目が終了すると、タスクa[P2]は終了し、工期が2日のタスクb[P1]、c[P1]は仕掛タスクとなり、
図9に示すように3日目も実行される。
【0159】
図8〜18に示すように、2日目以降も同様にして、着手可能タスクを求め、これにワーカーを割り当てることを、全てのプロジェクトの全てのタスクが終了するまで繰り返す。これにより、
図18に示すように、12日目が終了すると、全プロジェクトの全タスクの実行が終了する。
【0160】
図19には、プロジェクト毎に、各タスクの1〜12日目にどのようにワーカーが割り当てられたかを示すスケジュールを表形式にまとめたものを示した。なお、
図19において、網点のハッチング(以下、ハッチングAと称する)で示したタスクは、着手可能タスクを示している。また、左上から右下に向かう斜線によるハッチング(以下、ハッチングBと称する)で示したタスクは、着手可能タスクのうち、実際にワーカーが割り当てられたタスクを表している。また、右上から左下に向かう斜線によるハッチング(以下、ハッチングCと称する)で示したタスクは、仕掛かり状態のタスクを表している。
【0161】
図19に示したスケジュールでは、ワーカーW1を3日雇用し、ワーカーW2を10日雇用し、ワーカーW3を11日雇用することが必要となるが、ワーカーの割り当ては、なるべくハッチングAで示した着手可能タスクに対してワーカーを割り当て、かつワーカーに余りがでないように、工期が左側にシフトするように、すなわち工期を短縮できるように割り当てることが好ましい。
【0162】
ワーカーをタスクに割り当てるディスパッチルールは、本実施形態では、最小人数最長工程単能工優先割当法を用いたが、ディスパッチルールはこれに限られるものではない。ディスパッチルールは適宜、様々な制約に基づいて適宜変更することができる。
【0163】
本実施形態では、
図19に示すようなスケジュールを求めたとしても、例えばワーカーの手配がつかなかった場合や、予想外のトラブルで工数が伸びた場合等の事態が発生した場合には、その時点でワーカーの変更に応じて労働者集合を変更したり、工数の変更に応じてタスク推定遂行時間割当関数を変更したりして、その時点から再度着手可能タスク集合を計算し直せばよい。このように、プロジェクトの進行途中において予想外のトラブルが発生した場合でも、その時点から着手可能タスク集合やワーカーの割当の再計算を容易に行うことができるので、予想外のトラブル等にも柔軟に対応できる。
【0164】
図20には、
図19に示した各プロジェクトの各タスクへ資源(ワーカー)を割り当てた表を、逆に各資源に対して各プロジェクトの各タスクが割り当てられた表として表現したものを示した。この表は、ジョブショップスケジューリングのマシン(この場合はワーカー)へのジョブ(この場合はプロジェクトとそれを構成するタスク)の割当を、ジョブを構成するタスクの半順序的加工条件、つまり一つのジョブを同時に二つの機械(ワーカー)によって加工することも可能という形で一般化したものである。ちなみに、マンション施工などでは、この並列作業は一部屋の内装(ジョブ=プロジェクト)で二人のワーカーが同時にその部屋で施工できる状況を示す。
【0165】
上記で説明したプロジェクトに対する資源の割当では、全体工期は12日である。また、プロジェクト毎に並列に作業が行えるだけの十分な人数がいれば、最短工期は、この場合のクリティカルパスになる6日になる筈である。そこで、ワーカーの雇用形態を変えることにより、この工期がどのように変化するかを考察する。
【0166】
図20では、ワーカーW1が延べ3日(一人で3日)雇用、ワーカーW2が延べ10日(一人で10日)雇用、ワーカーW3が延べ11日(一人で11日)雇用されている。すなわち、一つの職種に対して一人を雇用してプロジェクトを実行している。これに対して、延べ人数は同じで複数人の同時雇用を許すように雇用形態を変えることができた場合に、プロジェクトの工期はどのように変化するのかについて計算した結果について説明する。
【0167】
図21には、ワーカーの雇用形態を以下のように変えることにより、どの程度工期が縮まるかについて計算した結果を示した。
ワーカーW1を1日雇用
ワーカーW1と同じ職能を有するワーカーW1'を1日雇用
ワーカーW1と同じ職能を有するワーカーW1"を1日雇用
ワーカーW2を4日雇用
ワーカーW2と同じ職能を有するワーカーW2'を6日雇用
ワーカーW3を7日雇用
ワーカーW3と同じ職能を有するワーカーW3'を4日雇用
【0168】
以上より、ワーカーW1、W1'、W1"は延べ3日雇用、ワーカーW2、W2'は延べ10日雇用、ワーカーW3、W3'は延べ11日雇用である。
【0169】
ここでは、雇用の延べ人数は
図19の場合と同じであるが、ワーカーを増員することにより、着手可能タスクに対してワーカーを集中して割り当てている。
【0170】
これにより、
図21に示すように、初日にワーカーW1の職能を有するワーカー3人で各プロジェクトのタスクaを1日で終了させている。ワーカーW2,W2'は、それぞれ2日目から連続4日雇用と連続6日雇用で延べ10日雇用。ワーカーW3、W3'は、それぞれ2日目から8日目まで連続7日雇用、2日目から5日目までの連続4日雇用で述べ11日雇用である。これにより、職能別の延べ雇用人数としては変化はないが、全体工期を8日に短縮することができる。
【0171】
このように、
図19でハッチングAで示された着手可能タスクをなるべく早めに遂行するように、延べ雇用人数を一定としつつ、雇用パターン(ワーカーの割付パターン)を変更可能な条件下では、かなりの最適化が可能であることが判る。上記のような簡単なディスパッチルールによるワーカーの割り当てにより、延べ雇用人数が同じで全体工期を12日から8日と2/3に短縮できる。
ただし、このような雇用条件の変化は、プロジェクトの種類によって異なる。例えば、医療等の分野では、雇用条件を簡単に変更することがはきない。また、高度検査機械などの限定リソースの割り当てもある。例えば緊急患者でその検査の割付や治療の割付が動的に変わっても、本実施形態に係る資源寄り付き型動的スケジューリングによれば、その都度、再割付が容易に可能となる。
【0172】
図22には、ワーカーの雇用形態をさらに以下のように変えることにより、さらにどの程度工期が縮まるかについて計算した結果を示した。
ワーカーW1を1日雇用
ワーカーW1と同じ職能を有するワーカーW1'を1日雇用
ワーカーW1と同じ職能を有するワーカーW1"を1日雇用
ワーカーW2を4日雇用
ワーカーW2と同じ職能を有するワーカーW2'を4日雇用
ワーカーW2と同じ職能を有するワーカーW2"を2日雇用
ワーカーW3を5日雇用
ワーカーW3と同じ職能を有するワーカーW3'を5日雇用
ワーカーW3と同じ職能を有するワーカーW3"を1日雇用
【0173】
以上より、ワーカーW1、W1'、W1"は延べ3日雇用、ワーカーW2、W2'、W2"は延べ10日雇用、ワーカーW3、W3'、W3"は延べ11日雇用である。
【0174】
このように、ワーカーW2"、W3"を追加することにより、全体工期は6日となり、プロジェクト単独のクリティカルパスの範囲内にまで全体工期を短縮することができることが判った。
【0175】
以上のように、本実施形態に係るスケジューリング装置10は、複数の並列して行われるプロジェクトの各タスクに対して、限られた人数の異なる技能を持つワーカーを、時系列で高速に割り当てることができる。このスケジューリング装置10で実行される処理は、職制のリーダーやワーカーが現場で行っている「その場・その時点で自らのチームにとって最適なワーカーを割り当てる」意思決定をアルゴリズム化したものと言える。このため、現実の作業進捗に近い工程表や勤務スケジュールを算出することができる。このアルゴリズムでは、開始、終了、着手可能なタスクやワーカーを時系列で集合論的に計算しながら作業とワーカーを割り当てるため、計算回数の少ない高速なスケジューリングが可能である。前述した例では、日毎の状態から着手可能なタスクやワーカーの集合を求め、これらの集合同士をマッチングさせるアルゴリズムとしている。
【0176】
これにより、本発明は、従来技術であるマルチエージェントシステムの技術を用いた場合と比較して、およそ数百分の1のスピードでスケジューリング結果を得ることができる。スケジューリングの結果は
図19に示したような各プロジェクトの日割りの工程表や、
図20に示したようなワーカー毎の勤務スケジュール表の様式で瞬時に表現できる。これらの管理表から、ワーカー不足で作業が進まない状況(
図19の網点のハッチングAで示した部分)やワーカーの空き状況(
図20の網点のハッチングAで示した部分)を一目で把握でき、計画している工程やワーカー編成の妥当性や問題を瞬時に判断できる。
【0177】
また、本実施形態では、前述してように、タイムカウンター集合TimeCounter及びタイムインターバル集合TimeIntervalを定義し、タスク毎に標準の推定遂行時間EstTimeAcompがタイムインターバル集合TimeIntervalへのタスク推定遂行時間割当て関数EstTimeAcompFとして定義される。このため、スケジューリングの任意の時点から条件を変更してスケジュールを容易に再計算することができ、プロジェクトの状況変化に対して柔軟に対応することができる。スケジューリングは前述のように高速で完了するため、短時間で何回でも条件設定を変更しながら最適化を目指したスケジュールの検討が可能となる。
【0178】
なお、本実施形態では、プロジェクトが集合住宅の各住戸の建築である場合について説明したが、プロジェクトはこれに限られるものではない。例えば、医療分野においては、患者がプロジェクトの対象となり、その標準治療手続きがプロジェクトとなる。タスクはそれぞれの治療やその準備行為や事務処理等の病院の諸手続き等で、それぞれの職能がタスクを遂行する。