ruby / rails中的约会调度

时间:2011-07-19 07:25:58

标签: ruby-on-rails ruby

我正在使用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分钟。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:3)

看看你的问题:

  1. 约会时间为60或90分钟。
  2. 午餐时间间隔为90分钟12:30-2:00
  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
    

    该算法使用了一些概念

    1. 约会r1与r2不兼容,如果它们重叠。
    2. 由于#1,我们知道i = 1,2,3的Ri1 / Ri2不会相互冲突。因为如果Ri2中的约会与Ri1不兼容,那么它也与午餐期不兼容,这是一个矛盾,因为我们取出了所有不兼容的约会。
    3. 一旦我们分开约会集,那就是解决2个调度问题,可以贪婪地解决。
    4. 这个算法仍然是O(n log n),因为你正在做贪心算法6次(一个常数),每次贪婪迭代都是O(n log n),前几行和最后一行是所有O(n)。

      人们在日程安排上撰写论文,这不是一个容易的问题。我建议您查看http://www.asap.cs.nott.ac.uk/watt/resources/university.html以便更好地理解。

      祝你好运:)