テレワーク 最適化 PuLP

テレワーク 最適化

テレワークに関する最適化問題を考えます。

次のような条件があるとします。

🔹従業員は5人います。
🔹月曜日から金曜日までの5日間とします。
🔹各従業員は週に1日オフィス勤務を行う必要があります。
🔹従業員ごとにテレワーク希望日が存在します。

解法

テレワークに関する最適化問題を解くために、PuLPを使用します。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
from pulp import *

# ①従業員の数と曜日のリスト
employees = range(5)
weekdays = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday']

# ②テレワーク希望日の設定
telework_preferences = [
[1, 1, 0, 0, 1], # 従業員0の希望日
[0, 1, 0, 1, 0], # 従業員1の希望日
[1, 0, 1, 0, 1], # 従業員2の希望日
[1, 0, 1, 1, 0], # 従業員3の希望日
[0, 1, 0, 0, 1] # 従業員4の希望日
]

# ③問題の定義
prob = LpProblem("Telework Optimization", LpMinimize)

# ④変数の定義
# telework[(i, j)] = 1 の場合、従業員 i は曜日 j にテレワークを行う
telework = LpVariable.dicts("telework", (employees, weekdays), 0, 1, LpInteger)

# ⑤目的関数の定義
# テレワークを行う日数を最小化する
prob += lpSum([telework[i][j] for i in employees for j in weekdays])

# ⑥制約条件の定義
# 各従業員は週に1日オフィス勤務を行う
for i in employees:
prob += lpSum([telework[i][j] for j in weekdays]) == 4

# ⑦各従業員の希望日にテレワークを行う
for i in employees:
for j in weekdays:
prob += telework[i][j] >= telework_preferences[i][weekdays.index(j)]

# ⑧問題の解決
prob.solve()

# ⑨結果の出力
print("Status:", LpStatus[prob.status])
print("Optimal Schedule:")
for i in employees:
print("Employee", i)
for j in weekdays:
if value(telework[i][j]) == 1:
print(j, "- Telework")
else:
print(j, "- Office")
print()

コードの内容は以下の通りです。

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

従業員と曜日ごとに、オフィス勤務をするかテレワークをするか最適化されたスケジュールを表示することができました。