资源有一个与之相关的成本(在线时间)。我们可以招募资源——这需要不同的时间量。我们可以在固定的时间间隔内进行招募。
为了估计规模:任何时候都会有大约20个资源,100个未完成的工作。完成工作需要5-15秒。招募资源需要1-2分钟,我们可以在1-30分钟的时间内招募(允许重新招募)。我们没有太多提前了解提交的工作,也许只有几秒钟的时间。
目标是以最低的成本(资源使用)完成工作,并保持给定平均延迟(工作完成时间)不变。
我希望得到关于算法、软件库或解决此问题的方法的指导。
这感觉像是几个方面:经济订货量,平衡前期招聘成本和运行成本;线性规划或整数规划,最小化总成本的公式,同时受到各种限制条件的约束;还有概率分布(招聘时间;所需工作资源?),使整个过程具有随机性。
听起来足够复杂,如果我在做这件事,我可能会建立一个模拟。这种方式似乎不太复杂,也不需要进行大量迭代或长时间运行的数学负担,因此您可以获得一些相当稳定和有用的结果。
我会这样看待它...不确定是否涵盖所有内容。
1) "资源" 实际上可以被视为 "工作中心"。 有多少个工作中心可以用来处理 "工作" 取决于谁登录了系统。
2) 按等待时间分配资源 - 等待工作的时间越长,他们在下一个请求的列表中就应该越靠前。这样就不会有人感到冷或者减速。您需要找到并设置一个门槛,根据此门槛(相对于资源和工作),您可以决定是让他们点击以获取下一个工作,还是让系统在工作之间自动获取一个工作。
3) 设置作业计划队列 - 我不知道这是否相关,但可能会有高/低优先级的作业等。你需要一个作业池,按 "攻击顺序" 列出。作业计划中的每个作业都可以通过不同的阶段,因此你知道每件事情的进展情况,并且知道何时完成后移动到下一个阶段。作业调度程序将寻找可用资源并将其分配给作业计划中的作业。这很可能是您安排系统的大部分核心。
我只希望你不是在建立一个出站呼叫中心 :P
我对这类问题的文献不太了解。不过,排队理论是一个广泛的学术领域,而这种情况并不像是一个荒谬的编造。当然,你关心的是平均延迟,而不是最坏情况下的延迟或第N个百分位数的延迟,这可能会让你成为少数派。
我的第一反应是,既然似乎有很多工作机会,那么一个好的解决方案就是雇用几个“灵活”的工人持续就业。这是一组工人,他们之间可以完成大多数常见工作,并且延迟可接受。你想要的延迟越低,这个集合中的资源就越多,他们花费的空闲时间也就越多。此外,如果输入是“突发性”的(假设突发事件是不可预测的),则需要更多的空闲时间以防止在突发事件期间出现高延迟。
然后,在两个场合你会雇用额外的“专业”工人:
1)出现了一种罕见类型的工作,你当前雇用的人只能以高时间成本或根本无法处理。因此,你雇用(粗略地说)能够处理它并且能够完成其余队列中大部分工作的人。
2) 没有这样的工作,但是您发现有机会雇用某些人,他们碰巧能够从当前队列中取出某些组合的工作,并以比您目前雇用的人更便宜的价格完成它们,但不会让您目前雇用的人空闲。因此,您雇用了这个资源。
至于实际算法:几乎肯定无法找到最佳解决方案,因此正确答案取决于处理资源,您正在寻找启发式和解决部分问题。只要您雇用的每个人都很忙,并且您不能雇用其他人而不在未来某个时间点导致显着的空闲时间,您可能在一个很好的解决方案附近,并且在延迟/成本权衡的“最大回报”点附近。在那之后再雇用更多资源将带来递减的回报,但这并不意味着您不愿意为指定的延迟和/或指定的预算这样做。
但这取决于传入的工作类型:如果您有一个只能做一种类型工作的资源,并且该工作每天/每周/每年只出现一次,那么最好是每天雇用他们,而不是等到有足够的工作来填补他们最小可能的时间片(这就是为什么消防员大部分时间都在打牌,而打字员大部分时间都在打字。总是有足够的打字工作让至少一个打字员忙碌,但火灾很少发生。此外,我们不希望对于火灾采用“性价比最高”的解决方案,我们需要比这更低的延迟)。因此,如果您正在解决问题的一个特定实例而不是编写通用调度软件,则可能存在调整算法以适应您特定资源集和传入工作模式的机会。
此外,如果资源是人类,您可能无法保证招聘成功。他们不会整天坐在那里,按分钟计算报酬,对吧?
太棒了的问题!!
我会研究动态规划、线性优化和排队理论。不幸的是,我无法以简单的方式回答这些问题。我没有数学专业知识,无法为这些问题提供坚实、最佳的答案。
然而,如果你对这些事情感兴趣,这听起来像是一个使用人工智能算法得到好的解决方案的机会,虽然可能不是最优的。我建议使用遗传算法或模拟退火算法。这两种方法都不需要很长时间编码。思路是选择随机的有效输入,然后可以调整这些潜在的解决方案,随着时间的推移将它们演变成更好的解决方案(或自动选择新的解决方案)。这是在获取最佳答案和花费大量时间编码和证明正确性之间的一个很好的折衷。
这听起来非常像实时操作系统调度。维基百科详细介绍了一些算法:
- 合作式调度
- 轮流调度
- 抢占式调度
- 固定优先级的抢占式调度,是抢占式时间片的一种实现
- 临界区抢占式调度
- 静态时间调度
- 最早截止时间优先方法
- 使用随机和MTG的高级调度
一些想法:
如果是这样,你就可以从一开始减少一些复杂性,然后使用某种形式的加权平均值来考虑偏好。另外,在招聘时,既然你最小的招聘时间为30分钟,并且假设他们成本更高,你可能希望确保他们具有最高的利用率。
这里有一些可能有所帮助的文章: