繁体   English   中英

调度:最小化非重叠时间范围之间的间隙

[英]Scheduling: Minimizing Gaps between Non-Overlapping Time Ranges

使用Django开发小型调度Web应用程序,在其中分配人员一定时间与上级会面。 将员工存储为模型,并与一个OneToMany关系关联到一个模型,该关系表示他们空闲的时间范围和星期几。 例如:

Bob: (W 9:00, 9:15), (W 9:15, 9:30), ... (W 15:00, 15:20)
Sarah: (Th 9:05, 9:20), (F 9:20, 9:30), ... (Th 16:00, 16:05)
...
Mary: (W 8:55, 9:00), (F 13:00, 13:35), ... etc

我的程序允许设置基本的日程安排,雇主可以选择查看前N个可能的日程安排,两次会议之间的间隔最小,前提是他们必须在一周内至少与所有员工见面一次。 我目前正在生成所有可能的会议排列,并过滤掉会议时间重叠的日程表。 有没有一种方法可以在M个可能的事件中生成前N个计划,而又不经历所有M个可能性?

澄清:我们正在尝试获取任何一天中的最小缺口总和,并将其汇总为整天。

我将使用A-star之类的搜索算法来执行此操作。 图中的每个节点代表一个人的可用时隙,从一个节点到另一个节点的路径表示node_anode_b在部分调度中。

另一个解决方案是创建一个图形,其中节点是每个人的可用时间,并且如果与node_a关联的人与与node_b关联的人不同,则从node_a到node_b会有一条边。 每个节点的权重是与两个节点关联的时间之间的时间量。

创建此图之后,您可以从该图生成最小生成树的变体。 该变体与MST的不同之处在于:

  1. 仅当与该节点关联的人员不在MST中时,才将节点添加到MST。
  2. 当所有人都在MST中时,您就完成了MST的创建。

生成的最小生成树将代表一个时间表。

要生成其他明细表,请从图形中删除刚刚创建的明细表中找到的所有边,然后从图形中删除边并创建新的最小生成树。

总的来说,调度问题是NP难题,尽管我无法想出一个简化的问题来证明这一点,但它与许多其他众所周知的NP完全问题非常相似。 可能存在多项式时间解,可以找到单日的最小差距(尽管我也不是一时知道),但我希望解决多天的希望不大。 不幸的是,这是一个复杂的问题,可能没有一个完美的答案。 (或者,当某人稍后发布时,我将踢自己。)

首先,我想说的是,如果您的数据集很小,并且您已经能够相当快地计算所有可能的时间表,那么您可能只想坚持使用该解决方案,因为所有其他解决方案都是近似值,并且可能最终如果运行时间的恒定因素较大,则运行速度会变慢。 (这意味着它不会随数据集的大小而增长,因此对于大型数据集而言,它会相对较小。)

最简单的近似方法是只使用贪婪的启发式方法。 几乎可以肯定地找不到最佳的时间表,并且如果大多数时间表重叠,并且可能只有很少的甚至是有效的解决方案,并且可能需要很长时间才能找到解决方案-但我将假设这是员工时间不是这样。

从一个任意的时间表开始,为每个员工随机选择一个时隙。 对于每次迭代,请选择一名员工,并将其时隙相对于当前计划的其余时间更改为最佳时间。 重复此过程,直到您对结果满意为止-当结果不再足够迅速或花费太长时间时。 您可能不想重复,直到您无法进行任何其他更改来改善计划,因为此过程可能会循环访问大多数数据。

这不是一个很好的启发法,但是它应该产生一些合理的时间表,并且有很大的调整空间。 您可能总是想总是先将重叠时间切换为其他时间,或者可能想翻转当前为最大差距做出贡献的员工,或者消除已经尝试过的某些时段。 有时您可能希望允许转向不太理想的解决方案,以期希望自己处在局部极小值中并希望摆脱困境-某些随机性也可以帮助实现这一点。 确保您始终跟踪迄今为止看到的最佳解决方案。

为了产生更多的时间表,最明显的事情就是以不同的随机时间表重新开始该过程。 或者,可以从找到的先前解决方案中任意翻转几次,然后从那里重复。

编辑 :这都与遗传算法相当相关,您可能要使用我在遗传算法中提出的一些想法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM