用于排序多个用户计划的算法或脚本

时间:2011-08-08 19:29:05

标签: database algorithm sorting scheduled-tasks

我有一个可能看起来像这样的数据集:

user_name
time_1
time_2
time_3

如果某一天的时间不同,则他们是免费的。每周有22个插槽,用户可以从三个中选择并提交。我将有大约100-150个用户,我想知道什么是最好的方式来对它们进行排序,以便在每个时间段均匀分配人数。我对最佳方法的最佳猜测是看看如果所有用户都放在他们的第一个插槽(time_1),然后是2和3并且比较哪一个给出最佳结果,然后从那里看看将会发生什么如果在插槽中添加或删除用户,以及这将如何影响整体性能。任何帮助都会受到赞赏,因为我没有做过很多优化算法。

此致

3 个答案:

答案 0 :(得分:1)

我正在回答,因为在许多人选择相同的插槽并且许多插槽没有或很少选择器的情况下,之前的答案显然会崩溃。例如,如果所有用户按顺序选择插槽(1,2,3),拓扑排序将不提供任何帮助。

在理想情况下,每个人都会选择一个插槽,并且所有插槽将具有相同数量的选择器(+/- 1)。如果我自己处理这个问题,我会尝试一个带有实时在线服务器的先到先得的政权,这样人们就可以只选择那些在登录时保持打开的插槽。

如果先到先得,先到先得不可行,我会 使用一种方法,激励人们选择不同的插槽,可能带有随机元素。这是一种这样的方法:

让所有人都有U人,争夺H时段。 (H = 22。)假设每个人被分配到一个插槽。令P = [U / H](即,U / H截断为整数)是每个时隙的标称人数。 (U mod H slot将包含P + 1个人。)对于时隙j,令D_j为3 * R1j + 2 * R2j + 1 * R3j,其中Rij是作为选择i请求时隙j的次数。对于更期望的时隙,D_j更高。给每个用户k分数W_k = 1 / D_ {C1k} + 2 / D_ {C2k} + 3 / D_ {C3k},其中Cik是用户k的第i个选择。也就是说,用户获得更多积分来选择具有低D值的插槽,而第二或第三选择选择的加权比第一选择选择更重要。

现在按D_j对插槽进行递增排序。 (首先填充“最繁忙”的插槽。)按W_k分数将用户按降序排序,并调用此列表S.

然后,对于每个插槽j:当j未满时,{在S中找到选择插槽j作为选择1的第一人k;如果找到,将k从S移动到插槽j。如果没有找到,请在S中找到第一个选择插槽j作为选择2的人k;如果找到,将k从S移动到插槽j。如果没有找到,请在S中找到第一个选择插槽j作为选择3的人k;如果找到,将k从S移动到插槽j。如果没有找到,则将最后一个人k从S添加到插槽j,并从S中删除k。}

在前面提到的坏情况中,所有用户按顺序选择插槽(1,2,3),此方法会将随机人员组分配给所有插槽。鉴于问题陈述,这是可以预期的好。

更新1:首先完全填补最繁忙的插槽可能会让一些人进入他们自称的第二或第三选择位置,因为他们可能在他们的首选位置没有冲突。填补最繁忙的优点和缺点,哪种游戏理论分析可能会解决。如果没有这种分析,现在我觉得最好通过以下(更简单)的方法来填充:如前所述,按W_k分数的降序创建已排序的用户列表S.现在按顺序浏览列表S,将人们放入他们选择并适应的第一个可用插槽中,否则进入仍然有开口的最受欢迎的插槽。例如,如果用户k选择了时隙p,q,r,如果p有空间则将k放入p,否则q如果q有空间,否则r如果r有空间,否则j其中j是具有开口的槽并且D_j是最大的

这种方法更容易向用户解释,是一种 更容易编程,并且通常可能更接近最佳。如果可以填充插槽而不采用第三方选择,它将会这样做。

答案 1 :(得分:0)

这只是一种启发式方法,但它可能会运作良好:

  1. 每个时段都计算可用于该位置的人数
  2. 使用最少的人填充时间段并填写22 /(总人数)或该插槽可用的最大人数。
  3. 从池中删除添加的人员,并对剩余的时间段重复此过程。
  4. 如果您需要最佳结果,可能需要使用约束求解器或线性程序求解器。

答案 2 :(得分:0)

这是图论理论问题,可以通过拓扑排序来解决:http://en.wikipedia.org/wiki/Topological_sorting