algorithm - 计算复杂职业管理日期的算法
问题描述
大家好 Stack Overflowers,
我有一种情况,我需要一些帮助来选择使算法工作的最佳方法,目标是管理资源的占用(让我们考虑资源 A)有多个任务,并且每个任务需要指定的数量的时间来完成。在这个第一阶段,我不想涉及多个变量,所以让我们保持简单的方式,让我们考虑他只有一个工作日的时间表。
例如:
1 - 我们有 1 个资源,资源 A
2 - 资源 A 从周一到周五早上 8 点到下午 4 点工作,为了简单起见,他现在没有吃午饭,所以每天工作 8 小时。
3 - 资源 A 有 5 个任务要完成,为了避免这个级别的复杂性,假设每个任务都需要 10 个小时才能完成。
4 - 资源 A 将于 2018 年 5 月 16 日下午 2 点开始处理此任务。
问题: 现在,我只需要知道所有 5 个任务的正确完成日期,但要考虑到之前的所有限制。
在这种情况下,他有 6 个工作日和第 7 天的额外 2 小时。我想要的预期结果是:2018-05-24(下午 4 点)。
实施: 我考虑了 2 个选项,并希望对此选项或我可能不会考虑的其他选项有反馈。
算法 1
1 - 创建一个“槽”列表,其中每个“槽”代表 1 小时,持续 x 天。
2 - 将此插槽列表与资源的小时计划交叉,以删除资源不在此处的所有插槽。这将返回一个列表,其中包含他实际可以工作的插槽。
3 - 用我给他的任务占据剩余的位置。
4 - 最后,检查最后占用插槽的日期/小时。
缺点:我认为这可能是一个矫枉过正的解决方案,考虑到我不想考虑他未来的职业,我只想知道任务什么时候完成。
算法 2
1 - 将任务小时数(50 小时)添加到开始日期,得到预期的FinishDate。(预计FinishDate = 2018-05-18(下午 4 点))
2 - 将开始日期和预期完成日期之间的小时数与时间表交叉,以获得他不会工作的小时数。(基本上会得到不可用的时间,每天 16 小时,将导致剩余时间计算 = 32 小时)。
3 - 使用不可用小时计算新的 expectedFinishDate,将这 32 小时添加到之前的 2018-05-18(下午 4 点)。
4 - 使用新的 expectedFinishDate 重复第 2 点和第 3 点,直到 remainingHoursForCalc = 0。
缺点:这会导致递归方法或非常奇怪的 while 循环,我认为这对于计算简单日期可能有点过分。
你有什么建议?有没有其他我可能不会考虑的选项可以让这更简单?或者您认为有一种方法可以改进这两种算法中的任何一种以使其发挥作用?
解决方案
我同意算法 1 是矫枉过正。
我想我会确保我有正确的条件:每天的小时数(8),工作日(周一,周二,周三,周四,周五)。然后将所需的小时数(5 * 10 = 50)除以每天的小时数,这样我就知道至少需要多少工作日(50 / 8 = 6)。稍微高级一点,首先除以每周小时数(50 / 40 = 1 周)。从开始日期算起工作日,以便在结束日期获得第一枪。该部门可能还有剩余,因此使用它来确定任务是否可以在这一天结束或运行到下一个工作日。
推荐阅读
- javascript - jsPDF/AutoTable 生成的PDF重叠页宽
- javascript - 重新加载页面动画后fps每次都在变化
- scala - 在scala中同时导入ExecutionContext.global和ExecutionContext.Implicits.global
- spring-boot - 带有文件控制的表单数据未上传
- php - 合并数组并删除重复值
- c# - C# 使用 XMLReader 类 f 获取 XML 子节点值
- corda - `No corda-webserver JAR found.` 部署 Corda 节点时出错
- css - 外部样式不覆盖 Shadow DOM 样式
- php - 当我使用显示帖子类别时
- 标记它的工作但是当我试图在选择框中显示帖子类别时它不起作用
- ruby-on-rails - Rails - SSL 不适用于裸域