我正在开发一个java应用程序,根据他们在各种科目中获得的分数,建议可能的学生群体(每组两到三名学生)。我想在设计自己的算法之前研究类似的算法。 例如,总共有两门课程,每组两名学生,算法应该将学生分组,使学生a在学科1中表现优秀,而学生b在学科b中应该是好的。/ p>
详细说明: 输入将采用以下形式:
student1<90.38<labs
Student1<93.01<exam
Student2<90.38<labs
Student2<85.20<exams
. . .
. . .
. . .
. . .
Studentn<61.48<exams
第一部分是每个学生的唯一ID,第二部分是获得的分数,第三部分是获得分数的特定课程部分。
算法应该创建两个学生组,根据每个组成部分,实验室和考试中获得的分数相互补充。
输出应该有点像
student1|student13|
student17|student15|
student8|student10|
. .
. .
. .
studentn|studentm|
其中每一行对应一组两名学生。
答案 0 :(得分:2)
这很容易。我只告诉你算法。
- 制作两个TreeMap。一个是考试中所有分数的值,另一个是 lab 中的所有分数。使用学生ID 作为键。
- 醇>
现在从每个TreeMap的第一个索引开始,然后选择值。
2.1。如果两个值具有相同的键,则选择下一个键选择两个不同的键并从地图
一个例子可能有所帮助。假设场景如下所示
Student ID lab exam
1 80 10
2 50 50
3 40 70
4 20 40
因此,在创建TreeMap之后,它将看起来像
labMap examMap
<K,V> <K,V>
<1,80> <3,70>
<2,50> <2,70>
<3,40> <4,70>
<4,20> <1,70>
所以你可以看到我们将首先选择1和3.
然后,当2和2相同时,我们将选择2和4.
3和2之后。
Atlast 4和1.
答案 1 :(得分:0)
我试着建议你一个帕累托最优算法:
SocialValue = -(*D1*+*D2*+*D3*+*D4*)
。请注意标志减去:这是因为您必须最大化SocialValue
,这是值总和的最小化。