テレワーク 最適化
テレワークに関する最適化問題を考えます。
次のような条件があるとします。
🔹従業員は5人います。
🔹月曜日から金曜日までの5日間とします。
🔹各従業員は週に1日オフィス勤務を行う必要があります。
🔹従業員ごとにテレワーク希望日が存在します。
解法
テレワークに関する最適化問題を解くために、PuLPを使用します。
1 | from pulp import * |
コードの内容は以下の通りです。
①employeesは従業員の数を示す範囲オブジェクトです。
weekdaysは曜日のリストです。
②telework_preferencesは各従業員の希望日を示す2次元リストです。
0はテレワーク不可、1はテレワーク可を表します。
③probは最適化問題を表すPuLPのオブジェクトです。
最小化問題として定義されています。
④teleworkは従業員と曜日の組み合わせに対する変数を表す辞書変数です。
値が0または1の整数として設定されます。
⑤目的関数を定義します。
全ての従業員と曜日におけるtelework変数の合計が最小化されるようになっています。
⑥制約条件を定義します。
各従業員は週に1日のオフィス勤務を行う必要があります。
従業員ごとにテレワーク日数が4になるように制約を追加しています。
⑦各従業員の希望日にテレワークを行うようにするための制約を追加しています。
telework_preferencesに基づいて、希望日にテレワーク変数が1以上である必要があります。
⑧prob.solve()を呼び出して、問題を解きます。
⑨最適化の結果を出力します。
最適化の状態や各従業員の最適スケジュールを表示します。
テレワーク日は“Telework”と表示され、オフィス勤務日は“Office”と表示されます。
結果
コードを実行すると、次のような結果が表示されます。
[実行結果]
Status: Optimal Optimal Schedule: Employee 0 Monday - Telework Tuesday - Telework Wednesday - Office Thursday - Telework Friday - Telework Employee 1 Monday - Telework Tuesday - Telework Wednesday - Office Thursday - Telework Friday - Telework Employee 2 Monday - Telework Tuesday - Office Wednesday - Telework Thursday - Telework Friday - Telework Employee 3 Monday - Telework Tuesday - Office Wednesday - Telework Thursday - Telework Friday - Telework Employee 4 Monday - Telework Tuesday - Telework Wednesday - Office Thursday - Telework Friday - Telework
従業員と曜日ごとに、オフィス勤務をするかテレワークをするか最適化されたスケジュールを表示することができました。