作業者自動割り当てツール 製作開始
工場などで仕事をしていると、人員割り当ての問題に悩まされると思います。
日によって工程が違ったり、作業者ごとに担当できる工程が限られていたりすると、人を割り当てるのに相当に頭を使ってしまいます。
最近またプログラミング熱に火が付いたので、人員割り当てツールの制作に取り掛かりました。
設計
まず、どうやったら達成できるかを考察しました。
資料
表1. 技能表
表2. 作業タイムライン
必要な情報は、個人が持つ技能の表、仕事のタイムラインの表。
能力の表1は、横軸: 工程名、縦軸: 作業者名、内容: 熟練度or優先度。
タイムライン表2は、横軸: 工程名、縦軸: 時間、内容: 必要人数
それぞれをcsvファイル(カンマ区切り)で用意しました。
出力する表は、横軸: 作業者名、縦軸: 時間、内容: 工程名
アルゴリズム
- タイムラインから1行取り出す
- その時間に必要な仕事の配列を作る。二人以上必要な工程は展開する。(工程A、工程B、工程B、工程Cのような感じ)
- 工程Aから順番に作業者を割り当てる
- 再帰処理により全ての割り当てパターンを列挙
- 列挙されたデータと能力表を照らし合わせ、それぞれのパターンの合計点数を計算
- 最も合計点数の高いパターンを出力する
- 1に戻る
取りあえず動くものを作る
土日を掛けてプログラミングをして
取り敢えず動くレベルのものが出来ました。
総当り列挙のため、大きな負荷が掛かると思い、C++で制作
伝家の宝刀MFCの出番(今では化石扱いらしい)
CSVを表示するダイアログを作って、3つの表で使いまわしてます。
表はリストコントロールのレポートスタイル
拡張スタイルは、グリッドライン、一行選択、コンボボックス付きです。
DWORD dwStyle = m_LvCsv.GetExtendedStyle();
dwStyle |= LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT | LVS_EX_CHECKBOXES;
m_LvCsv.SetExtendedStyle(dwStyle);
昔、VC6.0でやってた頃に比べると、IntelliSenseで定数が表示されるようになってて、簡単になってますね。
やっぱり楽しい
CSVを高速に処理する、CSVReaderクラスを作ったり
Numpyのような行列を扱うテンプレートクラスCMatrixを作ってみたりと
アイデアを形にしていく作業は、ワクワクが止まりません。
作業者配列と工程配列を引数に点数配列を出力するCrossVectorみたいなメソッドを作ってるときが最高でした。(厨二全開)
BOOL CrossVector(vector<int>& vecX, vector<int>& vecY, vector<Elem>& result) {
int i, cnt;
cnt = vecX.size();
if (vecY.size() != cnt)
return FALSE;
result.resize(cnt);
Elem e;
UINT row, col;
for (i = 0; i < cnt; i++) {
row = vecY[i];
col = vecX[i];
if (row > m_nRow || col > m_nCol)
return FALSE;
Get(row, col, e);
result[i] = e;
}
return TRUE;
}
たったこれだけの処理なんですけど
課題
- 休み時間を割り当てられるようにする
- 入力CSVを自由に選べるようにする
- データ範囲チェックの厳格化
- チェックボックスのON・OFFで手軽に試行できるようにする
- 人員不足の時間に警告を出す
課題は山積みですが、1つ1つ解決しながら実用レベルまで仕上げていきたいと思います。
1件の返信
[…] 前々回の記事で書いた作業者の自動割り当てツールがひとまず完成しました。 […]