作業者自動割り当てツール 製作開始

工場などで仕事をしていると、人員割り当ての問題に悩まされると思います。

日によって工程が違ったり、作業者ごとに担当できる工程が限られていたりすると、人を割り当てるのに相当に頭を使ってしまいます。

最近またプログラミング熱に火が付いたので、人員割り当てツールの制作に取り掛かりました。

設計

まず、どうやったら達成できるかを考察しました。

資料

表1. 技能表

表2. 作業タイムライン

必要な情報は、個人が持つ技能の表、仕事のタイムラインの表。

能力の表1は、横軸: 工程名、縦軸: 作業者名、内容: 熟練度or優先度。

タイムライン表2は、横軸: 工程名、縦軸: 時間、内容: 必要人数

それぞれをcsvファイル(カンマ区切り)で用意しました。

出力する表は、横軸: 作業者名、縦軸: 時間、内容: 工程名

アルゴリズム

  1. タイムラインから1行取り出す
  2. その時間に必要な仕事の配列を作る。二人以上必要な工程は展開する。(工程A、工程B、工程B、工程Cのような感じ)
  3. 工程Aから順番に作業者を割り当てる
  4. 再帰処理により全ての割り当てパターンを列挙
  5. 列挙されたデータと能力表を照らし合わせ、それぞれのパターンの合計点数を計算
  6. 最も合計点数の高いパターンを出力する
  7. 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件の返信

  1. 2021年4月3日

    […] 前々回の記事で書いた作業者の自動割り当てツールがひとまず完成しました。 […]

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です