破解调度难题:通过操作研究解决调度问题
#python #problemsolving #machinelearning #msexcel

介绍
在当今快节奏的世界中,有效的安排对于优化资源,提高效率和实现业务目标至关重要。在此博客中,我们将探索两个有力的工具来解决计划问题:Excel和Python。两者都提供了不同的优势和方法来应对复杂的调度挑战。我们将深入研究每种方法的好处和局限性,展示Excel的直观界面以及Python的灵活性和自动化功能如何帮助您征服甚至最复杂的调度拼图

方案
考虑到我们必须为医院创建时间表。目的是每周设计医生时间表。一旦将医生分配到工作日,他/她连续三天工作,然后休假4天。必须至少在定期的工作日中至少有周末休息。每周需求如下

我们 th fr
需求 16 12 18 13 15 9 7

建筑解决方案

Image description

数学模型

1. 目标函数:最大程度地减少安排工作周的医生总数。

<数学“>/mi> t o r <你strenty =“ false”>( i <您strenty =“ false”>) ) 方法1:Excel求解器
  • 决策变量是每天需要的医生#。 (在黄色细胞中突出显示)

  • 对象功能是最大程度地减少医生的总数

  • 约束1:是工作日的医生总和>周末(sum(d5:d7)> sum(d8:d11)
    约束2:一天的总数应大于日常需求。已经使用了sumpropropuct
    例如。对于一个工作日的Sumproduct($ D $ 5:$ D $ 11,E5:E11)>当天的需求。

Image description

求解器的结果
目标函数: 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