情報処理技術者試験で良く出てくるクリティカルパスの計算を完全に理解する

# 内容
十年以上前から情報処理技術者試験をたまに受けております。
たまに受けるため、高度試験を受ける際は午前Ⅰの免除の期限切れで午前Ⅰから受験することが多いです。今回はプロジェクトマネジメント試験を受験予定ですが、このPMの範囲の午前Ⅰで昔から苦手にしている問題が2つあります。それがEVMとクリティカルパス。両方とも何となく理解はしておりましたが、根本的に理解して人に説明出来るかと聞かれると微妙なので今回内容をまとめてみました。なおEVMについては[EVM(アーンドバリューマネジメント)の各指標の意味を理解する](https://qiita.com/infra365/items/4b0375f71fef3c91428e)にまとめております。

# アクティビティ
業務でもWBSを作ることが良くあると思います。スコープを細かく分割して管理しやすい単位にしたのがワークパッケージ、ワークパッケージをさらに細かく作業単位まで落とし込んだものがアクティビティとなります。スケジュール管理をする際にWBSだけで管理する場合もあると思いますが、WBSだけだと作業間の依存関係が見えません。（例えば作業Bを開始する前に作業Aを完了させる必要がある。）これを表現できる方法がクリティカルパス法です。
![CP1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523652/7634e6f4-2819-9559-c756-bd714623bf83.png)

# クリティカルパスの概要
例としてアクティビティをつなげたものがあります。アルファベットがアクティビティ名、数字が所要時間です。
![CP2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523652/b2a0787d-ec89-5d0b-ba8d-2a138efeea86.png)

ここで各アクティビティが完了するまでの所要時間を計算していきます。Aが完了するのは5日、Bが完了するのは13日（5+8）。計算で注意する箇所は2つのタスクが交わる箇所。Hの開始条件はEとFの完了が条件となっています。A→C→Fの合計は（5+7+5）で17、A→B→Eの合計は（5+8+9）で22です。EとFが開始してHが開始できるので大きい方の数字22を取ります。（真ん中の赤丸の箇所です。）このように全てのアクティビティ完了時の所要時間を計算していきます。
![CP3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523652/c24be2b0-08ee-765d-1c34-ad7f49b80c2e.png)

そして最も時間がかかる経路をつなげたものがクリティカルパスとなります。この経路の進捗遅れが全体の進捗に影響するため、集中的に管理する必要があります。例えばクリティカルパス上Hの日数が4→5に遅れると全体の工期が29日になってしまいます。対してクリティカルパス外のCが7→8になっても全体の工期28日には影響はありません。

![CP4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523652/8a760e20-7aa5-f8da-f358-2c50a2385f93.png)

# フロート（余裕日数）を求める方法
## ボックスを使う方法
ここまでは理解しやすいのですが、これだと各アクティビティにどの程度日数の余裕があるかが直感的に把握出来ません。そこで下記のような、最速開始日、最速終了日などを用いてフロート（余裕度）を求める方法がありますが、このあたりでいつもこんがらがってしまいます。ですので、今回はここを理解するために重点的にまとめました。

![CP5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523652/92af9d60-d6df-4619-7a4b-0f7c8175644f.png)

## 用語
まずは下記用語がありますがこの用語だけだと良く分からないので、サラッと見て各用語は図の箇所で説明をします。

|用語|説明|
|:---|:---|
|最早開始日|最も早く作業が開始出来る日|
|最早終了日|最も早く作業を終了出来る日|
|最遅開始日|この日までに仕事を開始させればよい日|
|最遅終了日|この日までに仕事を終了させればよい日|
|トータルフロート|全体の余裕日数|
|フリーフロート|後続の最早開始日に影響を与えない余裕日数|

## 最早開始日と最早終了日の計算
ここからクリティカルパスと余裕（フロート）を計算していきますが、まず最早開始日を最早終了日を計算していきます。この時Start側から順に計算をしていきます。

![CP6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523652/1aaceb75-b019-94a4-8a55-29747118b844.png)

* Aの計算
起点を0として考えると0日目に作業を開始出来ます。そして所要時間が5日なので最も早く作業を終了させれるのは5日後となります。

* B/Cの計算
BとCはAの作業完了が開始条件となっています。従って最も作業を早く開始出来るのはA完了後の5日となります。最も早く作業を終了出来る日は5に各所要時間を足して計算します。（Bなら5+8）、（Cなら5+7）

* Hの計算
HはEとFの作業が完了条件となっています。従って最も作業を早く開始出来るのは両方の作業が完了した後なのでE完了後の22日が最早開始日になります。最早終了日は所要時間+4で26です。

## 最遅開始日と最遅終了日の計算
次に最遅開始日と最遅終了日の計算をしてきますがこの時はEnd側から計算していきます。

![CP7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523652/33545d04-6b84-81df-4014-c6ad8af16fad.png)

* G/Iの計算
全体の工期は最早終了日の最大値より28日です。従ってGとIの最遅終了日=この日までに作業を終了すればよい日を28日とします。最遅開始日=この日までに作業を開始させれば良い日は最遅終了日-所要日数となるため、Iなら（28-2）、Gなら（28-7）となります。

* Bの計算
2つの作業が交わっている箇所の計算です。DとEはBの完了が条件となっていますが、この場合、小さいほうの最遅開始日をBの最遅終了日とします。
Dの最遅開始日は14（遅くても14日には開始する必要がある。）
Eの最遅開始日は13（遅くても13日には開始する必要がある。）
上記よりBは遅くても13日には完了させる必要があります=Bの最遅終了日は13日

## トータルフロートの計算
どの位作業が遅れても良いかの余裕日数の計算を行います。最遅終了日=この日までに作業を終わらせる必要がある日と最早終了日=最も早く作業を終わらせられる日との差になります。

![C8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523652/52890c29-cc6c-12a2-dc43-5d03607be920.png)

* Eの計算
Eは22日まで終わらせる必要があり（最遅終了日）、最も早く終わらせられる日（最早終了日）も22日です従って（22-22）で余裕がない作業になります。

* Fの計算
Fは17日まで終わらせる必要があり（最遅終了日）、最も早く終わらせられる日（最早終了日）は12日です従って（17-12）となり、5日遅れても全体に遅れがない作業となります。

## フリーフロートの計算
フリーフロート=（後続の最早開始日に影響を与えない余裕日数）です。その作業が遅れた際に後続の作業開始に影響があるかの計算となります。

![CP8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523652/0d996238-09de-6ea6-710f-2f975047e52c.png)

* Bの計算
Bの後続作業DとEは最早13日から開始できます。（=最早開始日）、Bの作業が最も早く完了するのは13日後です。（=際最早終了日）。従ってフリーフロートは（13-13）で0です。Bの作業が1日遅れてしまうと後続のDとEを開始出来る日が1日遅れてしまいます。

* Fの計算
Fの後続作業Hは22日から開始できます。（=最早開始日）、Fの作業が最も早く完了するのは17日後です。（=際最早終了日）。従ってフリーフロートは（22-17）で5です。Fの作業が5日遅れても後続Hの作業には影響がないことが分かります。

* Cの計算
Cの後続作業Fは12日から開始できます。（=最早開始日）、Cの作業が最も早く完了するのは12日後です。（=際最早終了日）。従ってフリーフロートは（12-12）で0です。トータルフロートは5日あるのでCが5日遅れても全体の遅れにはなりませんが、フリーフロートが0なので、Cが遅れると作業Fの開始が遅れてしまいます。

## クリティカルパスの計算
トータルフロートが0のアクティビティを繋げたものがクリティカルパス=余裕のない経路となります。
![CP9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523652/b05d01d4-e997-9009-a4c5-4db61e836ba9.png)

# まとめ
スケジュール管理でEVM(アーンドバリューマネジメント)を使用することがありますが、こちらのスケジュールの指標はクリティカルパスを考慮していません。（クリティカルパス外の作業が進んでいても進捗を表す指標がプラスとなるため）アクティビティ間の関係からクリティカルパスや作業の余裕度を計算すると、全体のどこがボトルネックになるかなどを把握することが出来ますのでこのあたりの概念を理解しておくのが良いかもしれません。