ページ移動:JavaScriptを有効にして下さい!
21.予定勤務日数

要員ごとに期間内の予定勤務日数を定めて起き、その日数に合わせるように勤務を割り振ります。
割り振った勤務日数が予定の日数に満たない場合は、自動で勤務を割り振って調整

自動で調整する勤務は、「超過可能数」として、日ごと及び勤務毎に数を指定して置きます。

条件等が複雑になってきたので整理しました。主に下記の項目
今までのシートと基本的には同じです。
- 目次 -


処理の流れ

フローチャート

A.まず、最低限の要員確保
  失敗したら、確保できるまで繰り返す
   無限ループなので、キャンセル(ESCキー押下)まで繰り返す

B.確保に成功したら、勤務の日数自動調整を行う
  調整に失敗したら、ランダム入れ替え(確保の条件を満たしながら)後、
  自動調整を繰り返す(10回まで)

  調整に失敗したら、再度、A.確保から繰り返す

C.最適均等化を行う

D.最大時間増加
 「改善が見られない最大時間」を15秒づつ増やしていく(初期値30秒)
 大きくするほど成功確率大、ただし、時間が掛かる。


赤矢印で、次の処理に移行するかを尋ねるメッセージが表示される。
続行しない場合は、処理を終了。
   

処理の詳細

ソルバーのパラメータ(条件および目標値)は、プログラムで設定しています。
(異なる条件で2回ソルバーを使用することと、シナリオが使用できない事のため)

個別実行を行うと、プログラムで設定したパラメータがそるばーダイアログに設定されていることがわかります。
また、全自動実行でも「途中停止」をオンにすると、その処理が終わった後に、実行したソルバーのダイアログを確認することもできます。
要員確保

  条件
    勤務番号は範囲内の整数  1以上勤務最大値以下
    条件_必須を満たすこと(=0)
      予約との重複無し、不可条件との重複無し、連続勤務不可条件との重複無し
        (=条件_予約勤務重複+条件_不可勤務重複+条件_連続 不可重複

  目標
    要員数と割り当て数の差を最小 目標_過不足


勤務日数自動調整

  条件
    条件_必須を満たし、かつ、要員不足で無く、超過可能数を超えないこと、および、
    各人の予定勤務日数を超過しないこと
        (=条件_必須+条件_要員不足+条件_要員過多+条件_超過日数

  目標
    予定勤務日数と割り当てた勤務日数の差)を最小  目標_予定数差


要員確保、勤務日数自動調整ともに共通の条件

  精度、収束条件、整数の範囲(勤務最大値)、変化させるセルの値は整数であること



ランダム入替

  条件
    勤務日数自動調整の条件と同じ

最適化

  目標
    勤務の分散値に重みを掛け、それぞれの合計(目標_最適化) を最小にする
       目標_最適化=重み_計*分散_計+重み_連休*分散_連休+重み_連勤*分散_連勤+重み_調整数*分散_調整数

  方法
    勤務を入れ替えて勤務のばらつきが小さくなるようにする。
    2人の勤務を異なる日で休みと勤務を同時に入れ替えることで連休や連勤務偏りを小さくする

シート上での設定値

名前


使用している名前には、ある程度の規則性を持たせています。
  例:条件式の場合、先頭が「条件_」から始まる。

名前 アドレス 
MSG =シフト表作成!$T$7
SERIAL =DATA!$B$3:$B$33
勤務リスト =シフト表作成!$D$6:$D$9
勤務最大値 =シフト表作成!$C$56
勤務変換表 =シフト表作成!$M$53:$N$57
行数 =シフト表作成!$C$54
集計 =シフト表作成!$V$60
重み_計 =シフト表作成!$Z$73
重み_調整数 =シフト表作成!$R$86
重み_連休 =シフト表作成!$AE$73
重み_連勤 =シフト表作成!$AI$73
出力 =シフト表作成!$L$40:$R$45
条件_確保 =シフト表作成!$L$88
条件_最適化 =シフト表作成!$L$96
条件_調整 =シフト表作成!$L$91
条件_超過日数 =シフト表作成!$Z$75
条件_必須 =シフト表作成!$L$99
条件_不可勤務重複 =シフト表作成!$M$122
条件_予約勤務重複 =シフト表作成!$M$109
条件_要員過多 =シフト表作成!$R$92
条件_要員不足 =シフト表作成!$M$92
条件_乱入替 =シフト表作成!#REF!
条件_連続不可重複 =シフト表作成!$M$131
設定値_収束値 =シフト表作成!$S$55
設定値_精度 =シフト表作成!$S$53
前旬 =OFFSET(シフト表作成!$E$64,0,0,行数,7)
前旬使用 =シフト表作成!$W$29
前旬列 =シフト表作成!$E:$K
表_超過可能 =シフト表作成!$L$13:$R$16
表_要員過多 =シフト表作成!$L$80:$R$83
表_要員不足 =シフト表作成!$L$75:$R$78
不可勤務 =シフト表作成!$L$20:$R$25
分散_計 =シフト表作成!$Z$72
分散_調整数 =シフト表作成!$R$85
分散_連休 =シフト表作成!$AE$72
分散_連勤 =シフト表作成!$AI$72
変化させるセル =OFFSET(シフト表作成!$L$64,0,0,行数,列数)
目標_過不足 =シフト表作成!$M$89
目標_最適化 =シフト表作成!$M$97
目標_予定数差 =シフト表作成!$M$94
予定数差 =シフト表作成!$AA$46
予約勤務 =シフト表作成!$L$102:$R$107
列数 =シフト表作成!$C$53

作成例

入力部

要員設定:必要最少人数を指定 超過可能数:各勤務の人数に幅を持たせます。
  空白は要員設定で指定した人数と一致しなければいけない。
  下図の例では、日勤のみ、1日(火)~7日(月)に各1名のみ要員設定表の人数より超過可

不可勤務:その日に出来ない勤務を複数指定可
連続不可勤務:勤務並び順びが不可なパターンを記述
予約勤務:予め決めて置きたい勤務を指定


出力部

出来上がったシフト表、および
各勤務ごとの日数集計表
連続する休みの個数(3連休/4連休/5連休以上の個数)
連続する勤務の個数(4連勤/5連勤/6連勤以上の個数)


計算部

勤務は計算上全て数値として扱います。(1~3が各勤務、0は休みを表す)


個別実行

初期化、最低要員確保、勤務日数自動調整、最適化などを単独で実行可
初期化以外は、現在のシートデータを元に実行します。

上から順に実行するか、途中のデータ(計算部の変化させるセルの値)を別シートに対ししておき、
復元してから次のコマンドを実行すると良いでしょう。

  ・初期化 - 「変化させるセル」をクリアし、予約勤務を転記

・確保条件 - 確保条件を定義したソルバーダイアログを表示
 「解決」でソルバー実行-確保のみ

・日数自動調整 - 「日数自動調整」の条件を定義したダイアログを表示
 「解決」で現在の状態から日数調整のみが行われる

・ランダム入替
 配置状態が変化するので日数調整成功しやすくなる。
 「全自動実行」の中にも組み込まれている。

・最適化 - 「目標_最適化」の値が最小になるように再配置

プログラムコード

メイン部 シート

ユーザーフォーム:個別実行

サブルーチン部 - 最適化、ランダム入替、予約転記、勤務色更新

関数部

共通変数部



関連

ソルバーを使用した魔方陣の作成 - 3x3,4x4
ソルバーによるシフトパターンの自動配置 - 人件費を最小に抑える従業員の勤務スケジュール

ページ移動:JavaScriptを有効にして下さい!

関連

×
PageTop