コンテンツにスキップ

スケジューリング問題への応用(後編)

2025-12-05-15-03-44

1. この記事の概要(前回のおさらい)

Section titled “1. この記事の概要(前回のおさらい)”

このページでは、スケジューリング問題への応用(前編)で紹介した定式化について、 その詳細な説明や具体的な定数の設定方法、そして、最適化を実行した結果までを順を追って解説します。

前編では、人員スケジューリング問題において最適化のために考慮すべき条件をいくつか挙げました。それらの条件をもとに、以下のような定式化を紹介しました。

E=αEα+λ1E1+λ2E2+λ3E3+λ4E4+λ5E5E = \alpha E_\alpha + \lambda_1 E_1 + \lambda_2 E_2 + \lambda_3 E_3 + \lambda_4 E_4 + \lambda_5 E_5

それでは、定式化の意味と各項の詳しい内容を見ていきましょう。


ここではスケジューリング問題への応用(前編)の定式化を詳しく解説していきます。

スケジューリング最適化のための目的関数として メイクスパン(全体の終了時刻)を最小化する項 を設定し、そこに必要な各種の制約条件を加えることで問題を定式化しています。

具体的には、次のような観点を制約として数式に組み込んでいます。

  • 実際に担当した作業量が、見積もり工数を満たしているかどうか
  • タスクが適切に連続して割り当てられているか(不自然な途切れがないか)
  • 1人の作業者が同時に複数のタスクを担当しないようにする(マルチタスク禁止)
  • 作業者やタスクごとに「この日程に割り当てたい」という希望を反映する
  • プロジェクトごとに定められたタスク順序が守られているかどうか

これらの制約を組み合わせることで、実際の現場に近い形でスケジューリングを最適化できるようになります。

以下では、定式化のそれぞれの項について詳しく解説していきます。

第1項はMakespan(スケジューリング全体の期間)の最小化をするための目的項です。

Eα=pfttxp,f,t.E_\alpha = \sum_{p}\sum_{f}\sum_{t} t\, x_{p,f,t}.

より遅い期間にタスクを割り当てるほど、項全体の値が大きくなるように設計しています。 つまり、QUBOソルバーによって、より短い期間でタスクを終わらせる効果を図る項になっています。

第2項は各作業者の作業工数の変化を考慮しながら、実際に割り当てたタスクが見積もり工数を満たすように制約を設ける項です。

E1=f(ptdp,fxp,f,t20dtAf)2.E_1 = \sum_{f}\left(\sum_{p}\sum_{t} d_{p,f}\,x_{p,f,t} - \frac{20}{d_{t}} A_{f}\right)^{2}.

それぞれの作業者ppが担当したタスクffを合計し、その値に各作業者のタスクごとの工数変化である実質作業倍率dp,fd_{p,f}をかけることで工数を数え上げるようになっています。 その値が、人月を人日に直した20Af20A_{f}と等しくなるように設計しています(1ヶ月あたりの作業日を20日と定義しています)。 なお、今回は日付の最小単位をttと定義しているため、左辺と単位を合わせるためにdt=0.1d_t=0.1で割っています。

第3項は割り当てるタスクの連続性を保証するために設計した制約項です。

E2=pft ⁣(xp,f,txp,f,(t+1))2.E_2 = \sum_{p}\sum_{f}\sum_{t}\!\left(x_{p,f,t} - x_{p,f,(t+1)}\right)^{2}.

ある作業者ppがタスクffを時間tt担当した際には、時間t+1t+1にも同じタスクをしてもらうという意味を持ちます。 各作業者ppを時間の最小単位ttに割り当てる際に、この項がなければ、連続してタスクを行うことを考慮できなくなります。 具体的には、終わらせるのに3時間必要なタスクがあった際に、9:00 〜 12:00にタスクを割り当てるのが理想ですが、 9:00 〜 10:00、14:00 〜 15:00、16:00 〜 17:00に割り当てられるというような効率の悪い割り当て方を防ぐ役割があります。

第4項は同時刻に複数のタスクを割り当てることを禁止する制約項です。

E3=pt ⁣(fxp,f,t12)2.E_3 = \sum_{p}\sum_{t}\!\left(\sum_{f} x_{p,f,t} - \frac{1}{2}\right)^{2} .

ある作業者ppのある時間ttに注目した際に、そのタスクffの合計が1つまたは割り当てないことを意味しています。この式において、1/21/2ではなく1を使うと、必ずその時間に1つのタスクを割り当てなければならないという強い制約になりますが、メイクスパン最小化の項と衝突してうまく割り当てが行われないことがあるため、1/21/2を選択しています。

対象とするスケジューリング問題に事前に定められている変数

Df,t={1タスク f を時間の最小単位 t に割り当て可能,0それ以外D_{f,t} = \begin{cases} 1 :& \text{タスク $f$ を時間の最小単位 $t$ に割り当て可能}, \\ 0 :& \text{それ以外} \end{cases}

を利用して、割り当ててはいけない期間にタスクを割り当てないようにする制約項です。

E4=ftp(1Df,t)xp,f,t.E_4 = \sum_{f}\sum_{t}\sum_{p} (1 - D_{f,t})\, x_{p,f,t}.

この項は、Df,t=0D_{f,t}=0のとき、すなわち割り当ててはいけない期間にタスクを割り当てた場合にペナルティが発生するように設計しています。

下記の表1は、xp,f,tx_{p,f,t}Df,tD_{f,t}の組み合わせごとに、ペナルティの和の中身がどのようになるかを示したものです。

表 1:xp,f,tx_{p,f,t}Df,tD_{f,t}の組み合わせ

xp,f,tx_{p,f,t}(仕事を担当するかどうか)Df,tD_{f,t}(タスク割り当て可能かどうか)罰金の値
000
101
010
110

Df,t=0D_{f,t}=0 、すなわち割り当ててはいけない期間の場合には、xp,f,t=1x_{p,f,t}=1とした場合にペナルティが発生します。

Df,t=1D_{f,t}=1 、すなわち割り当てが可能な期間の場合には、この項からはペナルティが発生しないため、他の項の制約条件に従って割り当てが行われます。

第6項は複数のプロジェクトが存在した際に、各プロジェクト内で決められているタスクの処理順番を決められた順番通りに実行するように割り当てを行う制約項です。

E5=(ij)t(pxp,j,t)(pttxp,i,t).E_5 = \sum_{(i \prec j)} \sum_{t} \left(\sum_{p} x_{p,j,t}\right) \left(\sum_{p'} \sum_{t' \ge t} x_{p',i,t'}\right).

まずは簡単な意味を捉えましょう。 ここで、(ij)(i \prec j)はタスクiiがタスクjjよりも前に実行されなければならないことを意味しています。 和の中身は、

  • 時刻ttにタスクjjを実行している作業者の人数

    pxp,j,t\sum_{p} x_{p,j,t}
  • 時刻tt以降にタスクiiを実行している作業者の人数

    pttxp,i,t\sum_{p'} \sum_{t' \ge t} x_{p',i,t'}

の積になっており、タスクjjよりも早く終わらせるべきであるタスクiiがタスクjjよりも後ろにあると、(pxp,j,t)(pttxp,i,t)(\sum_{p} x_{p,j,t})(\sum_{p'} \sum_{t' \ge t} x_{p',i,t'})分だけペナルティが発生します。

量子アニーリングでは、エネルギーを最小化するような解を探してくるので、エネルギーが高くなるような選択肢は選ばないということを逆手に取った項の設計になっています。

まとめると、タスクjjが時刻ttに存在する(始まっている)条件

pxp,j,t>0\sum_{p} x_{p,j,t}>0

が満たされている際には、タスクiiが時刻tt以降に存在しない条件

(pxp,j,t)(pttxp,i,t)=0\qty(\sum_{p} x_{p,j,t})\qty(\sum_{p'} \sum_{t' \ge t} x_{p',i ,t'})=0

を満たしてほしいという意味になります。


ここでは、量子アニーリングを用いて、提案したQUBO式によって実行可能解が得られるかどうかを見ていきましょう。

提案するQUBO式を量子アニーリングを使用して下記の問題サイズで実装してみます。 なお、本問題は全結合の問題であり、変数の数はworker×task×time\text{worker} \times \text{task} \times \text{time}だけかかるので、本問題サイズの場合、3×5×1903 \times 5 \times 190となります。

ここで実施期間は19日としていますが、作業者ごとの工数変化に対応するため1日をdtdt分割した時間枠に割り当てを行っており、time=190\text{time}=190となります。

したがって、3人の作業員が5つのタスクを19日の期間以内に行う場合、2850(=3×5×190)2850(=3 \times 5 \times 190)変数を使用すると推測できます。

これは量子アニーリングが解くことのできると言われている180変数を大きく超える値であるため、今回はハイブリッドソルバーであるBQMのLeapHybridSamplerを用いた結果を示します。

では、今回解く問題設定を明確に定義していきましょう。以下の表2のような問題サイズを考えます。

表 2:検証する問題サイズ

プロジェクトタスク(プロジェクトにおける処理順番)作業人数実施期間
2つプロジェクト1:(0→1→2),プロジェクト2:(3→4)3名19日

次に、スケジューリング問題への応用(前編)の3.2章で定義した定数の具体的な値を決めていきます。

これは問題設定をする部分なので、自身の設定した問題に必要な値を自身で定義していきましょう。

今回は、例として各タスクの工数と実施時期を以下の表3のように定義しました。

表 3:タスクと工数の関係と実施希望時期

タスク番号AfA_f(工数:人月)Df,tD_{f,t}
タスク 00.2850
タスク 10.37100
タスク 20.34150
タスク 30.30190
タスク 40.29190

表3より、タスク0を終了するには0.28人月必要なことがわかります。

また、Df,tD_{f,t}は割り当て可能な期間を表しており、表3の数字はスケジューリング期間のはじめから数えて、何個分の時間単位以内で割り当て可能かを示しています。

例えばタスク0のDf,t=50D_{f,t}=50は、初日から 50 時間単位分以内に割り当てることができます。すなわち 5 日目まで(1 週間)に割り当て可能であることを意味しています。(ここでは1週間を平日5日間、月20日作業可能であるとしています。)

次に、作業者のスキルレベルによる工数の変化に対応するために、以下の表4のように各スキルレベルに対して、実質行った作業倍率を定義します。

表 4:スキルレベル別作業工数倍率

スキルレベル工数倍率
レベル 10.50
レベル 20.71
レベル 31.00
レベル 41.25
レベル 51.42

これは実際に割り当てられた工数に、それぞれ作業者のスキルレベルをかけることで実質行った仕事量として換算しています。

例えば、レベル3の作業者があるタスクを行った場合、その作業量に1をかけます。一方で、レベル1の作業者が行った場合には、その作業量に0.5をかけます。すなわち、レベル1の作業者がそのタスクを行ったとしても、実質行った作業量は半分であるということを表しています。

表4の定義を使って、それぞれの作業者がタスクに対してどのスキルレベルを持つのかを以下の表5のように定義してあげます。

表 5:各作業者と工数倍率の関係 dp,fd_{p,f}

Task 0Task 1Task 2Task 3Task 4
Worker 00.500.710.501.250.50
Worker 10.500.501.250.710.71
Worker 21.420.710.500.710.50

dp,fd_{p,f}は、スキルレベル表における実質倍率をどの作業者が割り当てられているかを表しています。

例えば、Worker0 はタスク0 に対してスキルレベル 1 ということがわかります。

ここまでで、式を作るための変数の設定具体的な定数の値の定義が完了しました。では、実際に量子アニーリングに結果を出してもらいましょう。

今回は定式化のパラメータα,λ1,λ2,λ3,λ4,λ5\alpha,\lambda_1,\lambda_2,\lambda_3,\lambda_4,\lambda_5をそれぞれ2.0,100.0,131.0,150.0,50.0,500.02.0, 100.0, 131.0, 150.0, 50.0, 500.0に設定して解いた結果を以下に示します。

量子アニーリングのハイブリットソルバーを用いて本問題を解いた結果(図1)を見ると、スケジュールの実施期間は19日間と設定しましたが、メイクスパンの最小化によって12日程度で完了できることがわかります。(第1項の効果

また、プロジェクト内の順番タスク0→タスク1→タスク2、タスク3→タスク4を守って割り当てがされていることや、割り当てバーが重複していないことから提案したQUBOが目的関数と制約を考慮しながら、割り当てを行うことができています。(それぞれ第6項、第4項の効果

さらに、タスク0は1週目(5日以内)に、タスク1は2週目以内に完了しているなど、割り当ててほしい期間にタスクが行われていることがわかります。(第5項の効果

2025-12-04-15-50-27
図 1:量子アニーリングによるガントチャートの結果

なお、わかりにくいのですが、割り当てを行っている最小単位時間は、図2の赤線の単位ごとです。図2を見ると、同じタスクは時間を空けずに割り当てられていることがわかります。よって、タスクをなるべく連続で割り当てることができています。(第3項の効果

2025-12-05-17-48-49
図 2:ガントチャートの割り当て最小単位

さらに図3からわかる通り、各タスクの工数を満たして割り当てを行うことができています。(第2項の効果

2025-12-04-16-53-29
図 3:割り当てタスク量と必要タスク量の比較

この結果から、今回の問題設定では量子アニーリングを用いて実行可能解が得られていることがわかります。

なおこの結果は、厳密解ソルバーであるGurobiの出した解と近く、ある程度最適解に近い解を出せていることがわかっています。


このページでは、ソフトウェア産業や製造業で重要となるスケジューリング最適化について、定式化の考え方を詳しく解説し、実際に数式として問題を組み立てることで最適化結果が得られるまでの流れを紹介しました。

QUBO形式で問題を定式化する際には、自分が解こうとしている問題をどのように数学的に表現するかがとても重要です。今回扱った例は、やや複雑で難易度の高い内容ではありますが、最適化の本質を学ぶ良い題材になっています。

まずは、もっとシンプルなスケジューリング問題や身近な例を使って、文章を数式に落とし込む練習 を積み重ねてみてください。 その経験が、さまざまな問題を自分で最適化できる力へとつながっていくはずです。

なお、この研究は現在論文執筆中の内容になります。

また、内容は変更される場合があります。


東北大学 情報科学研究科 大関研究室 修士2年

矢代開士