Algorithm 正在寻找一种对一组数据进行排序的聪明方法

Algorithm 正在寻找一种对一组数据进行排序的聪明方法,algorithm,sorting,complexity-theory,Algorithm,Sorting,Complexity Theory,我有一组80名学生,我需要把他们分成20组,每组4人。 我从先决条件模块中获得了他们以前的考试成绩,我希望确保排序后的组成员成绩的平均值尽可能接近以前考试成绩的总体平均值 对不起,如果不是特别清楚的话 下面是问题的快照: Student Score AA 50 AB 45 AC 80 AD 70 AE 45 AF 55 AG 65 AH 90 所以这里的

我有一组80名学生,我需要把他们分成20组,每组4人。 我从先决条件模块中获得了他们以前的考试成绩,我希望确保排序后的组成员成绩的平均值尽可能接近以前考试成绩的总体平均值

对不起,如果不是特别清楚的话

下面是问题的快照:

Student    Score
AA         50   
AB         45 
AC         80
AD         70
AE         45
AF         55
AG         65
AH         90
所以这里的平均分数是62.5。我最好如何将这八名学生分成两组,每组四名,这样两组学生的综合考试成绩的平均值都尽可能接近62.5分

我的问题正是这个,但有80个数据点(20组),而不是8个(2组)


我越想这个问题就越难解决

有人有什么想法吗


谢谢

首先按分数排序。因此,它变成:

AH  90
AC  80
.....
AB  45
AE  45
然后开始将第一个与最后一个组合:

(AE, AH, 67.5)
(AB, AC, 62.5)
(AD, AA, 60)
(AG, AF, 60)
以此类推,在另一种情况下,你会将二者结合起来。前两个和后两个

另一种方式:

 1. Find all the possible groups by 4 students.
 2. Then for every combination of groups find the abs deviation from the average score and SUM it up for the combination of groups.
 3. Choose the combination of groups with the lowest sum.

起初,我确实考虑过上下匹配选项。 然而,正如John所强调的,结果肯定不是最优的:

Scores              Students                            Avg.
40  94  40  94      'AE'    'DA'    'AI'    'AR'        67
40  90  40  88      'AK'    'CI'    'AM'    'BP'        64.5
40  85  40  80      'AQ'    'AW'    'AT'    'BD'        61.25
40  79  40  77      'AU'    'BC'    'AV'    'AB'        59
40  76  40  75      'AX'    'CG'    'AZ'    'CQ'        57.75
40  75  40  75      'BF'    'CB'    'BN'    'BQ'        57.5
40  75  40  74      'BR'    'BI'    'CF'    'CZ'        57.25
40  74  40  74      'CK'    'CO'    'CP'    'AL'        57
40  72  41  71      'DB'    'CN'    'AG'    'BO'        56
41  71  42  70      'CD'    'BM'    'AH'    'BS'        56
42  70  42  69      'BG'    'BL'    'CU'    'CX'        55.75
43  68  44  67      'BK'    'CY'    'AD'    'CE'        55.5
44  64  44  64      'BJ'    'CR'    'BZ'    'BY'        54
45  64  45  63      'BW'    'BV'    'CS'    'BE'        54.25
45  62  47  60      'CV'    'CH'    'AC'    'CM'        53.5
47  59  47  58      'BT'    'AY'    'CL'    'AP'        52.75
47  57  48  57      'CT'    'BA'    'BX'    'AS'        52.25
48  56  49  56      'CA'    'AJ'    'AN'    'AA'        52.25
50  55  50  54      'BB'    'AF'    'CJ'    'AO'        52.25
51  52  51  52      'CC'    'BU'    'CW'    'BH'        51.5

一种可能的解决方案:

我会尝试使用贪婪算法,首先将每个学生与另一个学生配对,使你最接近你的目标平均值。在初始配对之后,您应该能够使用相同的方法从第一对中进行后续配对

在第一轮配对后,该方法利用两个平均值的平均值并将其与目标平均值进行比较来创建后续组。您可以阅读更多关于为什么这会解决此问题的信息

但是,


这不一定会给你最佳的解决方案,而是一种解决问题的启发式技术。下面一个值得注意的例子是,一个低值必须被三个高值抵消才能达到目标平均值。这些类型的分组将不会用这种方法来解释。然而,如果你知道你有一个相对正态分布围绕着你的目标均值,那么我认为这个方法应该给出一个不错的近似值

“我越想这个问题,它看起来就越难”——事实上,它是NP难的。这就是多路划分问题。对于像你这样规模的问题,进化算法方法是一种合理的策略,而且不太难实现。我恐怕以上所有这些对我来说都是陌生的。我担心我可能会在这里陷入更深的境地……这充其量只是一个启发。你有任何理由认为这是一个特别好的启发吗?首先,当分数向某一方向倾斜而不是呈钟形曲线下降时,它似乎表现得相当糟糕。有1.78 x 10^91种方法可以将80名学生分成20组,每组大小为4。你的最后一段描述了一种不可行的暴力方法。这种方法的问题是,没有理由认为在最优解决方案中,4人一组将分成2人一组,这样2人一组将接近目标均值。例如,出现一个非常低的分数,需要用3个高分来平衡,这样任何一对分数都会远远偏离平均值,这并不罕见。然而,对于某些分布,这可能是一种合理的启发式方法。对,因为这是一种贪婪的技术,这意味着这可能无法获得全局最优解。但是,对于这个问题,不能保证您可以以这样的方式对学生进行划分,即每个组始终满足目标平均值。相反,您的总体目标是最小化错误,通过在每个分区上选择局部最优分组,总体错误应该是最小的。这种方法也很容易实现,并且在每个分区上以合理的O(n^2)执行时间运行。我同意这是一种合理的启发式(so+1),它比机械地将最低值与最高值配对要灵活一些,但结果分区并没有使总体错误最小化(不管这是如何衡量的)。这可能是一个很好的第一步,之后可以采用爬山方法,交换元素对,直到找到局部最优解。我明白你的意思,这不是一个完美的方法,也不是交换元素对的好主意。