预约调度算法

时间:2015-02-13 23:24:43

标签: algorithm schedule

假设您需要为CEO安排会议。必须安排尽可能多的会议(计数,而不是持续时间)。

工作日有开始时间和结束时间。

某些时间段不可用(午餐等)

输入是一个时间列表。持续时间为30,60或90分钟。

我的方法

将日期表示为布尔数组。索引是时间。每个数组索引代表30分钟。因此,[0]代表上午9点,而[1]代表上午9:30。 day [1] = true表示9:30是开放的,如果错误则关闭。

有一个计数器变量来跟踪当前最早的空闲时间。每次迭代会议列表,查看当前空闲时间+会议持续时间是否打开。运行时间为O(N * N)。

缺陷

但是,我的方法并没有导致一天中挤出的会议次数最多。例如,我有120分钟的免费区块,以及90,60和60分钟的潜在会议。我的算法首先迭代到90分钟的会议并安排它,但是浪费了30分钟的空闲块。更好的方法是在那里安排60分钟的会议。

另一个想法

获取潜在会议的所有组合,总持续时间不超过90分钟,并跟踪最大会议次数。我相信这必须通过排列和每个空闲块的O(N * N!)来完成。所以这个的总运行时间是O(N * N * N!)。

我将不胜感激任何反馈和替代解决方案。谢谢!

1 个答案:

答案 0 :(得分:0)

我为您准备了一个新算法,实现起来相对简单。首先适应所有90分钟的会议,如果剩下一些,他们就不适合。现在进行60分钟的会议并将其放置。如果剩下一些,请在30分钟的窗口内找到90分钟的会议(不能有60分钟的窗口或会议适合),并用60分钟的会议中的2个替换它。如果还剩下60分钟的会议,则用60分钟的3分钟替换连续2次90分钟的会议。如果还剩下60分钟的会议,则用60分钟的会议替换任何90分钟的会议。然后去30分钟的会议以清空空位。如果还有剩余,请用3x 30分钟替换90分钟的会议。如果剩下更多,请更换60分钟的会议。

据我所知,背包问题是应该有一个多项式解决方案,这似乎是合适的,所以如果这样做,...如果n是计划中的空闲插槽数,那么上限为6 * N ^ 2。它与等待安排的会议数量无关。