Alteryxの処方的分析カテゴリの最適化ツールのサンプルワークフローを読み解いていきたいと思います。
今回は、ヘルプの「サンプルワークフロー」の「Predictive tool samples」の「Prescriptive Analytics」にある「4 Optimization Workforce Scheduling」を読み解いていきます。
4 Optimization Workforce Scheduling
まず、ワークフローの説明文を見ていきましょう。
設問
このサンプルワークフローでは、「レストランが顧客へのサービスを確保しながら、従業員の給与の総コストを最小化できるよう、ある時間に何人の従業員がシフトを開始するか、各時間帯にどんなタイプの従業員(フルタイム、パートタイマー)を配置するか決める」という問題に対して、最適化問題として理解しています。
以下のような条件です。
レストランは、午前11時から午後8時まで営業します。
各時間帯に平均的に来店する顧客グループを以下のように以下のように仮定しています。
時間 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 |
---|---|---|---|---|---|---|---|---|---|---|
グループ数 | 4 | 24 | 16 | 4 | 4 | 12 | 24 | 40 | 32 | 20 |
各従業員は、1時間あたり4つの顧客グループに対応できます。
また、従業員のタイプによって働く時間は異なります。フルタイム従業員は1日あたり8時間。パートタイマーは1日あたり4時間です。ただし、休憩時間は無視します。
従業員の給与は、フルタイムでは時給6ドル、パートタイマーは時給8ドルです。
ビジネス上の問題:各時間帯に何人の従業員が必要か?
※各時間帯について、11時=t1、12時=t2・・・20時=t10とします。
方程式への落とし込み
1. 変数を選ぶ
変数は、シフトのタイプとなります。
2. ビジネス上の目的(Objective)を確認する
Objectiveは、給料の最小化です。これは、フルタイム * 8 * 6、パートタイマー * 4 * 8を合計したもので得ることができます。
これをO入力に入れる場合は、lb、ubは、lbは0、ubはInf。今回は人数なので、Iとなります。
variable | coefficient | lb | ub | type |
---|---|---|---|---|
Fulltime | 48 | 0 | Inf | I |
Parttime | 32 | 0 | Inf | I |
ただ、今回シフトを考慮すると、このままでは難しいです。開始時間ごとに別々のデータにする必要があります(理由は後述)。つまり、以下のようになります。
![](https://analytics-x.tech/wp-content/uploads/2023/04/Optimization_38.png)
それぞれのシフトは以下のようになります。
![](https://analytics-x.tech/wp-content/uploads/2023/04/Optimization_39.png)
3. 制約条件を確認する
制約条件は、各時間帯ごとに従業員の数が顧客グループの数以上になっているかどうかです。11時をt1とし、20時をt10とすると、以下のようになります。
- t1 >= 4
- t2 >= 24
- t3 >= 16
- t4 >= 4
- t5 >= 4
- t6 >= 12
- t7 >= 24
- t8 >= 40
- t9 >= 32
- t10 >= 20
さて、これを実際の式にする時、左辺はどう表現すればいいのか悩ましいところです。
Objective確認のところに出てきたシフト表とどう組み合わせるか、、、先程出てきたシフト表の一番下に上記の条件を書き込んでみましょう。
![](https://analytics-x.tech/wp-content/uploads/2023/04/Optimization_40.png)
よくよく考えると、この形式は前回の「3 Optimization Fantasy Sports Lineup」で使った「密行列、行の変数」の形式です。
つまり、最適化ツールの入力アンカーAの制約モードは、「密行列、行の変数」とし、B入力は一番下のdirとrhsを書けば良いだけです。
A入力
![](https://analytics-x.tech/wp-content/uploads/2023/04/Optimization_39.png)
各行は、シフト(variable)です。
B入力
constraint | dir | rhs |
---|---|---|
t1 | <= | 1 |
t2 | >= | 6 |
t3 | >= | 4 |
t4 | >= | 1 |
t5 | >= | 1 |
t6 | >= | 3 |
t7 | >= | 6 |
t8 | >= | 10 |
t9 | >= | 8 |
t10 | >= | 5 |
ここでは、シフト表ではすべて1にしているため、rhsは4で割った数値にしています(サンプルワークフローではシフトはすべて4になっています)。
4. ワークフローの構築
![](https://analytics-x.tech/wp-content/uploads/2023/04/Optimization_41.png)
若干楽をするために、O入力は若干テクニカルに作っています。
設定
![](https://analytics-x.tech/wp-content/uploads/2023/04/Optimization_42.png)
入力アンカーAの制約モードは、「密行列、行の変数」としています。
O入力
![](https://analytics-x.tech/wp-content/uploads/2023/04/Optimization_38.png)
個人的には、Fulltimeって1~3、Parttimeも1~7で十分ではないかと思います(本来働くべき時間より短い時間はOKなのか?という疑問です)。
A入力
![](https://analytics-x.tech/wp-content/uploads/2023/04/Optimization_43.png)
A入力はExcelで作ってペタッと貼り付けています・・・。行生成ツールやクロスタブを駆使すればAlteryx内でスマートに作ることもできます。
B入力
![](https://analytics-x.tech/wp-content/uploads/2023/04/Optimization_44.png)
S出力
![](https://analytics-x.tech/wp-content/uploads/2023/04/Optimization_45.png)
D出力
![](https://analytics-x.tech/wp-content/uploads/2023/04/Optimization_46.png)
I出力
![](https://analytics-x.tech/wp-content/uploads/2023/04/Optimization_47.png)
まとめ
- シフトの割当問題は、一見難しく思えますが、シフトのパターンと各時間に何名必要か、というだけの問題に置き換えることができれば、シフト表と各時間の必要タスクを書き換えれば定形パターンとして利用できそうです。
- 書く時間帯にどれくらいお客さんが来るのか、といった問題は機械学習など使えば予測可能です。つまり、最適化ツールと機械学習を組み合わせることでシフトの自動化なども可能となります。
- 今回休憩時間をまったく考慮していませんが、休憩時間を固定にしてしまえば(シフト上で0とすれば)そのまま適用することも可能です。
サンプルワークフロー
Designer に付属のワークフローで問題ないですが、念のためにアップロードしておきます。
コメント