技能一覧 › 大学数学 アルゴリズムと計算量

区間スケジューリングの貪欲法

終了時刻の早い順に重ならない区間を選ぶ貪欲法を実行して、選ばれる区間の集合と個数を求められる

前提

中学までに習ったことだけで始められます。

説明

いくつかの区間(会議の時間帯、機械の使用時間など)が与えられたとき、互いに重ならないように選べる区間の最大個数と、それを実現する選び方を求める技能です。手順は簡単で、区間を終了時刻の早い順に並べ、それまでに選んだ区間と重ならないものを順に取っていくだけです。教室の予約や作業の割り当てなど、『1 つの資源を時間で分け合う』場面で使います。

なぜそうしてよいのか

区間 (ただし )は時刻 に始まり時刻 に終わるものとし、ある区間の終了時刻と別の区間の開始時刻が等しい場合は重ならないとみなします。終了時刻が最も早い区間を とします。重ならない区間を最も多く選んだ選び方(最適解)を 1 つ考え、その中で最も早く始まる区間を とします。 の終了時刻は全区間の中で最小なので です。最適解の他の区間は より後に始まり、しかも と重ならないので、開始時刻はどれも 以上、したがって 以上です。よって を に取り替えても重なりは生じず、個数も変わりません。つまり『 を含む最適解』が必ず存在します。

を選んだら、残りは『開始時刻が 以上の区間だけを使う、より小さい同じ形の問題』になります。上の最適解から を除いたものはこの小さい問題の選び方になっているので、小さい問題で最大個数を選べば全体でも最大になります。そこでも同じ理由で、終了時刻が最も早い区間を選んでよいことがわかります。これを繰り返すのが貪欲法です。直観的には、早く終わる区間を選ぶほど後に残る時間が長くなり、後で選べる区間の可能性を最も多く残せる、ということです。

手順

  1. すべての区間を終了時刻 の小さい順に並べる(終了時刻が等しいものの順は任意でよい)。

  2. 「最後に選んだ区間の終了時刻」を表す変数 を用意し、まだ何も選んでいないので とする。

  3. 並べた順に区間 を 1 つずつ見て、 なら(最後に選んだ区間と重ならないので)その区間を選び、 と更新する。 なら選ばずに飛ばす( は変えない)。

  4. 最後まで見終わったら、選んだ区間の集合が答えの選び方であり、その個数が重ならずに選べる最大個数である。

例題

次の 8 個の区間がある。ただし区間 は時刻 に始まり時刻 に終わるものとし、一方の終了時刻と他方の開始時刻が等しいときは重ならないとみなす。

終了時刻の早い順に選ぶ貪欲法を用いて、互いに重ならないように選べる区間の最大個数を求めよ。

例題の解答

手順1: 終了時刻の小さい順に並べると となる(括弧内は終了時刻)。
手順2: とする。
手順3: : なので選ぶ。。
: なので飛ばす。
: なので選ぶ。。
: なので飛ばす。
: なので飛ばす。
: なので選ぶ。。
: なので飛ばす。
: なので選ぶ。。
手順4: 選ばれた区間は で、個数は 。貪欲法の結果は最適なので、最大個数は である。

答え:

よくある誤り

この説明は AI が書き、別の AI が例題を独立に解いて答えを確かめ、説明を一歩ずつ査読しました。

入口の問題

この技能を使う問題