将用户分组到队中的算法(基于每个团队的最小/最大数量)

时间:2016-11-26 21:50:21

标签: algorithm sorting math

我正在尝试提出一种算法,用于对固定数量的用户进行排序和分配。我发现的大多数算法都假定要除以的组数;我想创建一个智能系统,其中自动分配组(尽可能最好)并根据用户总数以及每组的最小和最大用户数进行预测。

为每个组假设以下标准:

  • 每组最少3个
  • 每组最多6个
  • 基于总用户数的智能分组

以下是基于总用户数和每组最小/最大值的一些可能性:

24位成员:

  • 4组5和1组4
  • 6组4
  • 4组6

21名成员:

  • 3组6和1组3
  • 3组5和1组6(更好的选择)

10位成员:

  • 2组5(更好的选择)
  • 2组3和1组4

虽然没有必要,但团体的“更好的选择”将是每组相同数量的用户(例如,10个成员将是2组5个),除非不可能(例如21个成员),其中5 + 5 + 5 + 6每组成员比“6 + 6 + 6 + 3”更“平等”。

2 个答案:

答案 0 :(得分:0)

根据您迄今为止给出的标准 - 最小的群体规模变化 - 案例数量有限。

  • 如果目标是3个,4个或5个的倍数,则分成相等大小的组。 (我们从不需要6人组。)
  • 否则目标是1或2(mod 3)。
    • 对于mod 1案例,使用一组4人,其他人为3人。
    • 对于mod 2案例,使用两组4人,其他人为3人。

注意21你遗漏了7组3的明显选择。

使用此算法:

  • 24 - 8组3
  • 21 - 7组3
  • 10 - 2组3组,1组4(1(模3)情况)
  • 14 - 2组3组,2组4(2(模3)情况)

也许你正在静静地思考(但不是说)你也希望尽量减少群体的数量。如果这是真的,那么您需要指出少数组和组大小变化的相对重要性。这两个因素需要权衡。

答案 1 :(得分:0)

这是JS的解决方案,适合任何感兴趣的人https://jsfiddle.net/kp8d0w27/6/

第一个循环检查是否可以平均分配与会者总数。如果可以,那就这样做。

第二个循环只有在总数不能被平均分割时才会运行,并且会循环,直到余数(模数)大于最小值且小于最大值。

最后,我使用一个名为chunk的Lodash函数将原始数组拆分成相等的部分。

- Generated (JIT:ed) code
- Loaded libraries (including jar and class files)
- Control structures for the java heap
- Thread Stacks
- User native memory (malloc:ed in JNI)

不是最干净的(并且在某些情况下我没有考虑到这一点,比如参加人数少于最小值),我仍在重构,但它运作良好并解决了我原来的问题。