仿真优化:帮助我的朋友对他公司的支持服务台进行建模和优化
优化仿真:助力朋友对其公司支持服务台进行模型与优化
关于创建模拟优化模型以帮助简化支持台人员配备的故事。
简介
这开始时只是一个相当简单的请求。我的朋友管理和运营一个支持中心,他遇到一些困难。在任何给定时间,支持台坐席似乎在优化方面效率低下,要么过剩,要么不足。他有关于电话、消息和电子邮件的来电时间、等待时间和对话时间的相当干净的数据。因为我的背景是运营研究(OR),我的朋友把这个问题介绍给了我。我很激动-在我的职业生涯中,我并不经常使用OR原则。这是一个机会,让我在我学习了五年的领域中摸爬滚打。
任何OR程序的核心是排队理论,而这是一个典型的m/m/c队列案例(确切地来说,是文本书例)。电话以设定的随机率进来,一些代理处理着这些来电,所有来电以设定的随机率进行处理,随机率应遵循指数分布。因此,我启动了Jupyter Notebook,并使用scipy将一些来电和处理时间拟合为指数分布。我发现,确实有一些参数与指数分布非常接近。
现在,如果我的朋友只想知道他的支持台应该有多少名员工,有一些公式可以准确告诉您;主要是Erlang-C。[1] 然而,就像任何现实世界的情景一样,当我们开始引入影响这个特定支持中心的多种参数时,该公式很快就失效了。举例来说:全天候变化的来电需求、员工效率、休息时间、员工需要上班的时间等等。所以我转向了模拟,这是运营研究的另一个核心要素。
模拟
模拟很有用,因为您不受特定公式的限制。您可以利用随机系统的特性自相矛盾,知道任何具有随机输入的系统将会收敛到一个确定的输出-只要您运行足够次数以获得可靠的平均值。通过调整模拟的某些部分并将输出与真实世界的训练数据进行匹配,可以解决系统和数据中的大部分异常情况。
- 获取终端员工管理:Amazon Forecast和AWS Step Functions
- 好运:《前夜》在GeForce NOW上领导17款游戏
- DARPA资助的研究取得了量子计算突破 (DARPA zīzhù de yánjiū qǔdéle liàngzǐ jìsuàn túpò)
所以我开始着手工作。接下来的几天里,我使用真实数据输入在Python中建立了一个支持台的模拟。我的模拟的核心部分包括考虑到全天候变化的来电时间和代理处理时间,同时还要考虑排队长度和参数变化时的代理工作情况。现在是决定要衡量的指标的时候,有许多选项可以考虑。我开始通过衡量代理利用率和平均排队长度来衡量,然而,支持中心的主要指标之一是连接时间服务等级协议(SLA)。[2] SLA实质上是人们在队列中等待多长时间的协议约定目标。无论何时有人打电话,支持中心都希望以短时间、可预测的方式来回答电话。
好在这相当容易。每次在模拟过程中进行测量时,我会检查排队队列中第一个人等待的时间有多久。知道排队队列中第一个人等待的时间最长,我们就能知道最大的服务水平协议仍然得到了满足。我们用他的数据制作了培训和验证集,进行了一些调整,我的朋友有了一个可以用来更改代理人数量、呼入电话参数并查看服务水平协议将会发生什么的工具。不能被忽视的是,这部分项目花费了很多时间。
优化
在一次公路旅行中,我们讨论了这个工具很有趣,但并不一定实用。我的朋友可以输入数字并查看结果,但这并没有帮助我们更容易做出员工编制决策,因为这基本上是经验和试错。更有用的是一个系统,你可以为全天设置目标服务水平协议,并且系统会提供最佳代理人排班以实现该目标,考虑到可变的呼入电话参数和代理人处理时间。这是运筹学的第三个伟大支柱:优化。
问题在于,在进行优化时,需要一个要优化的公式,而我们只有一个模拟。然而,我意识到我们完全可以将模拟作为优化问题的目标函数。它接受一组输入,并通过多次运行模拟给出确定的输出。好在,30年前的研究人员也有了相同的想法,并从那时起一直在研究模拟优化领域。这些聪明的人已经为我做了所有艰苦的工作。[3, 4]
所以,我再次开始工作。现在,模拟优化的核心是创建一组输入,运行它们在模拟中,并以智能方式选择下一组输入,直到达到目标。我的优化问题看起来像这样:
我的目标是构建一个排班表。排班表由班次组成。班次是模拟“一天”(比如上午9点到下午5点,上午10点到下午4点)的固定时间,代理人可以在这些时间段工作。排班表是所有班次的集合,记录每个班次有多少代理人在工作。一个好的排班表可以使服务水平协议保持在目标水平附近,并最小化总工时(工人人数 * 他们班次的长度)。某些班次有工作人数的上限(例如,只允许10人在上午半天班工作),并且每个班次都有一定的休息时间安排。服务水平协议不应超过目标的严格上限(例如,我们的目标是3分钟的服务水平协议,但不应有人等待超过10分钟)。
我设置了这个框架,以考虑所有这些约束条件,现在我已经准备好进行优化了。模拟优化研究中的一些问题很难解决,因为它们的模拟是一个黑盒子,除了模拟的答案之外,我们不会获得任何有用的信号。幸运的是,这个模拟不同。我们测量整个模拟“一天”中的等待时间,因此我们可以看到某些班次相互之间的比较结果。
例如,如果早班比晚班有更多的代理人,但晚班有更多的呼入电话,我们可能会发现晚班相对于早班更偏离目标。在下一次尝试中,我们可能应该增加晚班上工作的人数。
事情并不像这么简单 —— 由于复杂的交叉班次和其他参数,它们会相互依赖,但我们可以将任何排班表输入模拟并观察结果。
我们从模拟中获得的这些信号引导我走向一个明确的策略,梯度。
基于梯度的搜索可以理解为将球往下滚动的过程,在每一步中,你都试图将球移到较低的位置,直到它到达最低点。这个过程的复杂之处在于山并不平坦。可能会有假底,无论选择哪个方向,都会使球回到山上,而真正的底部则需要你从不同的位置开始滚动。实际上,我们永远不会知道是否已经到达真正的底部,但有聪明的方法确保我们进行了足够多的测试,以知道我们离最低点已经很接近。在我们的情况下,球就是一个排班表,山的底部就是完美的线,所有呼入电话都恰好等待目标服务水平协议的时间。
那么,什么是最自然的梯度步骤呢?如果平均值超过了目标,就在移动中添加一个代理,如果平均值低于目标,就减少一个代理。如果你陷入了所有的变动都使计划变得更糟的困境,而且SLA与目标还没有接近,就回到以前的好的计划,并从那里重新开始。我尝试了其他选择下一个计划的方法,但这是最一致的。你如何知道何时停下?设定一个容差,如果每个班次的平均时间与目标相差不到30秒(例如),就认为问题解决。如果已经走了太多步骤,就停下来,并从模拟的计划中选择最好的。
在理想的世界中,我们会永远运行这个程序,尝试每一个计划,直到找到最好的,但是我们需要在5分钟之内选择一个计划。这个项目最有趣的部分是测试优化算法,找到能够最快得出一个好解决方案的算法。
最好的结果使用了这样一个事实:你可以控制模拟运行的次数,代价是运行次数越少,对结果的信心越低。以下是我发现有效的方法:
当开始运行优化算法时,从较少的模拟开始,当目标接近时,增加模拟次数。这是因为在开始时,许多变动都会使计划朝着目标的方向变化,所以选择的方向不太重要。当一个好的解决方案越来越接近时,计划的走向就变得更重要了。再加上所有从相同的零点开始的分层运行,以确保探索到更广泛的解决方案。
这种方法的好处是我能够控制算法运行的时间。我可以看到模拟运行所需的时间,并相应地调整迭代次数,我也可以选择从起始点开始的次数。每台机器上运行此算法的性能都有所不同,保持一致的算法运行时间对于确保该项目在现实世界中有用非常重要。
#schedule is {(start_time, end_time): num_agents}{'Schedule': {(0, 540): 5, (30, 570): 2, (60, 600): 1, (90, 630): 1, (120, 660): 4, (150, 690): 1, (180, 720): 0, (210, 750): 1, (240, 780): 18, (0, 660): 0, (30, 690): 0, (60, 720): 0, (90, 750): 0, (120, 780): 3}'Average Wait': 0.5738814985851588'Worker Units': 660.0'Worst Shift Time In Queue, Relative to Target': 0.5965600329117189}
结论
现在我的朋友有了一个根据他的输入和约束条件能够建立一个计划的程序。它是否能够很好地运行还有待观察。我们将等待收集关于计划和模拟准确性的足够的数据。现实世界中会有一些我们没有考虑到的因素,比如人们生病或度假。但模拟的好处是,任何没有考虑到的因素我们以后可以添加。这不需要对整个项目进行大规模的改动。我们只需要在需要的地方替换即可。
这个项目最重要的部分之一是一切都能独立工作,并且非常模块化。我们可以将任何不规则性建模并纳入模拟中。很多作业项目因为解决方案的刻板而没有离开课堂。在我看来,这个项目尤其有用,因为它具有灵活性和改造能力。现实世界中的事物在变化,技术解决方案应该能够适应变化以保持相关性。
最后的想法
非常感谢这个项目中的朋友Jeremy Harper。
这个项目引起了我对这个领域的兴趣,我很希望能够尝试用不同的问题再次进行。如果您有一个现实世界中需要建模、模拟和优化的问题,我很愿意听到并有可能在这个领域的进一步项目上合作。我的领英页面。
参考资料
1. Rahul Awati,《Earlang C》,techtarget.com
2. Naveen Mahadevan,《服务级别协议》(2022),sprinklr.com
3. N. Jian, S. Henderson,《模拟优化导论》(2015),Winter Simulation Conference
4. Y. Carlson, A. Maria,《模拟优化:方法与应用》(1997),Winter Simulation Conference