エクセルにソルバーが乗っているし、必要な人月と割り当てられる人を元に線型計画法で最適な割り振りを求めてみたいなって思った.高校生のときにやったな…懐かしい…

問題を整理するとこう.

「特定の業務タスクがあってそれぞれに必要となる工数が決まっている.
その状況において各業務タスクにおいて能力の異なる人間に
適度に割り振り作業をしてもらう.
各人間には使用できる労働時間Tに限りがある.」

たぶんだいぶ簡単に解けそう.

具体的な話にすれば

パンを作る仕事ジャムを作る仕事があって平均能力では両方とも4ヶ月必要.
いまパンを平均能力でジャムを平均能力の8割で作れるAさんと
ジャムを平均能力の6割でジャムを平均能力の9割で作れるBさんがいる.
Aさんは3ヶ月だけ、Bさんは6ヶ月しか働けない」

って感じ?

ポイントは

  • パンを作るにもジャムを作るにも4ヶ月以上の工数がかけられればよい.(制約条件)
  • それでいてみんなの使用時間を短くしないと時給の時間が伸びてしまう.それを最小化したい.(目的関数)
  • あとそれぞれの能力によってかかる時間が違うからそれも短くしたい.(制約条件)

になる.
まさに高校生にやったときの設定だ…

これを数式に下ろすと

変数 : 各人Hが各仕事Wにかける時間t_hw

係数 : 各人Hが各仕事Wで発揮できる能力 e_hw (固定. 能力係数)

制限 : 各人Hが使用できる労働時間 t_limit_h

制限:最低限必要な各仕事Wに必要な時間 t_limit_w

目的 : できるだけ最小化したい労働時間 t_total (Σt_hw)

これをちゃんと式にすると

目的関数

min.png

制約1 : 各人Hが捻出できる最大人月

new_limit1.png

制約2 : 各仕事Wを達成するのに必要な人月

limit2.png

この条件下で解けばいいはず!

あらかじめ決めておくべきは工数に使える時間と必要なタスクにかかる人月.
あとは、各人間の能力係数.

エクセルでも解くなら

「ソルバー」を開いて、上記の目的関数や制約条件を入力すれば解ける.
目的関数の最小値がでるようにする.

変数セルの範囲は上記のt_whを定義しているセルを選べば良い

以下のようなテーブルを用意することになる.

table.png

できたー

満足です.