我正在使用rails中的呼叫中心软件,需要为可以处理客户呼叫的代理安排约会。说完呼叫中心软件后,需要确保我尽可能利用整个代理的时间表来安排预约,留出最少的漏洞数量(代理人没有预约)。
考虑到代理商的时间表,例如某一天的上午9:00到下午5:30,下午1:00到下午1:30之间的午休时间为30分钟,我需要安排不同长度的预约,一些60分钟90分钟。
如果出于某种原因,午休时间会在时间表上留下一些漏洞,我应该可以将午休时间提前30分钟+/-,因此可以在下午1:30之前移动 - 而不是下午1:30 - 下午2:00或12:30 PM - 1:00 PM。
我开始创建午休时间作为一种约会,它将提供移动starts_at和finishes_at属性的灵活性。约会是60分钟或90分钟,这是30分钟的倍数,午餐也是30分钟,我开始将代理商的时间表分成每个30分钟的时间段。
因此,对于特定日期的特定代理,查看他的日程安排我实例化了一系列插槽,每个插槽的持续时间为30分钟,starts_at和finishes_at属性为9:00 AM - 9:30 AM,9:30 AM - 10 :00AM等。
我需要一些帮助来循环通过这个预约插槽阵列并拉出2个连续插槽或3个连续插槽,具体取决于60或90分钟的持续时间预约,请记住我应该能够移动午餐+/- 30分钟。
非常感谢任何帮助。
答案 0 :(得分:3)
看看你的问题:
我们希望尽量减少没有约会的分钟数。
现在,您有一个时间间隔要填补,即上午9:00到下午5:30。假设约会在9:00-5:30之间,我们可以使用贪心算法根据最早的完成时间(source)和您的附加约束进行区间调度。
基本上算法如下(伪)
Let R be the set of all appointments
Let R11 be the set of appointments from R before 12:30 that are compatible with 12:30-1:00 and R12 be the set of appointments from R after 1:00 that are compatible with 12:30-1:00
Let R21 be the set of appointments from R before 1:00 that are compatible with 1:00-1:30 and R22 be the set of appointments from R after 1:30 that are compatible with 1:00-1:30
Let R31 be the set of appointments from R before 1:30 that are compatible with 1:30-2:00 and R32 be the set of appointments from R after 2:00 that are compatible with 1:30-2:00
Let R1Comb = findSet(R11) + 12:30-1:00 + findSet(R12)
Let R2Comb = findSet(R21) + 1:00-1:30 + findSet(R22)
Let R3Comb = findSet(R31) + 1:30-2:00 + findSet(R32)
Function findSet(R)
Let A be the time interval to fill
While R is not empty
Choose a request r in R that has the smallest finishes_at
Add r to A
Remove all appointments in R that are not compatible with r
EndWhile
Return A
EndFunction
Return the R that has the smallest amount of holes in R1Comb, R2Comb, R3Comb
该算法使用了一些概念
这个算法仍然是O(n log n),因为你正在做贪心算法6次(一个常数),每次贪婪迭代都是O(n log n),前几行和最后一行是所有O(n)。
人们在日程安排上撰写论文,这不是一个容易的问题。我建议您查看http://www.asap.cs.nott.ac.uk/watt/resources/university.html以便更好地理解。
祝你好运:)