介绍:
在当今快节奏的世界中,有效的安排对于优化资源,提高效率和实现业务目标至关重要。在此博客中,我们将探索两个有力的工具来解决计划问题:Excel和Python。两者都提供了不同的优势和方法来应对复杂的调度挑战。我们将深入研究每种方法的好处和局限性,展示Excel的直观界面以及Python的灵活性和自动化功能如何帮助您征服甚至最复杂的调度拼图
方案:
考虑到我们必须为医院创建时间表。目的是每周设计医生时间表。一旦将医生分配到工作日,他/她连续三天工作,然后休假4天。必须至少在定期的工作日中至少有周末休息。每周需求如下
天 | 我们 | th | fr | ||||
---|---|---|---|---|---|---|---|
需求 | 16 | 12 | 18 | 13 | 15 | 9 | 7 |
建筑解决方案 :
数学模型:
1. 目标函数:最大程度地减少安排工作周的医生总数。
o
-
决策变量是每天需要的医生#。 (在黄色细胞中突出显示)
-
对象功能是最大程度地减少医生的总数
-
约束1:是工作日的医生总和>周末(sum(d5:d7)> sum(d8:d11)
约束2:一天的总数应大于日常需求。已经使用了sumpropropuct
例如。对于一个工作日的Sumproduct($ D $ 5:$ D $ 11,E5:E11)>当天的需求。
求解器的结果:
目标函数: 31
天 | 我们 | th | fr | ||||
---|---|---|---|---|---|---|---|
医生# | 11 | 0 | 10 | 3 | 2 | 4 | 1 |
方法2:Python纸浆。
from pulp import *
# Create the problem
prob = LpProblem("Hospital Staffing", LpMinimize)
# Create a list of doctors
doctors = [i for i in range(50)] # Choosing value big enough
# Create a list of days
days = ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"]
# Define the demand for each day of the week
req_doctors = {"Monday": 16, "Tuesday": 12, "Wednesday": 18, "Thursday": 13, "Friday": 15, "Saturday": 9, "Sunday": 7}
# Create the decision variables
# Each doctor i starts their 3-day shift on day j
x = LpVariable.dicts("Doctors", (range(len(doctors)), range(7)), 0, 1, LpBinary)
# Set the objective function
prob += lpSum(x[i][j] for i in range(len(doctors)) for j in range(7))
# Minimum number of doctors for each day
# For each day of the week, we count doctor as available not only on the start day of their shift but also on the two next days
for j in range(7):
prob += lpSum(x[i][(j-k)%7] for i in range(len(doctors)) for k in range(3)) >= req_doctors[days[j]]
# Doctor can only start their 3-day work shift once in a week
for i in range(len(doctors)):
prob += lpSum(x[i][j] for j in range(7)) <= 1
# Solve the problem
prob.solve()
print("Status:", LpStatus[prob.status])
work_schedule = {day: [] for day in days}
for i in range(len(doctors)):
for j in range(7):
if x[i][j].varValue > 0:
for k in range(3):
work_day = days[(j + k) % 7]
work_schedule[work_day].append("Doctor " + str(i))
for day in days:
print(day + ":")
for doctor in work_schedule[day]:
print(doctor)
print()
print("Total number of doctors = ", value(prob.objective))
python执行的结果:
目标功能:31
day mo tu我们fr sa su
医生#16 12 18 13 15 12 7
注意:纸浆确实没有sumproduct,我们还有另一个用于同一问题的最小值。因此,求解器本来可以说与当天需要的#New医生的时间表。在任何给定的一天中,纸浆输出仅计数
结论:
Excel熟悉的界面和功能强大的公式使广泛的用户可以访问它,从而使他们能够轻松创建有效的时间表。另一方面,Python提供了一个强大的编程框架,可以在解决复杂的调度问题时自动化,优化和可扩展性。无论您是喜欢电子表格的简单性还是编码的多功能性,您现在都拥有在调度问题方面表现出色的知识和工具。
进一步读取:
Excel Solver Add-In