基于商标的小组学生

时间:2014-01-05 11:18:50

标签: java algorithm

我正在开发一个java应用程序,根据他们在各种科目中获得的分数,建议可能的学生群体(每组两到三名学生)。我想在设计自己的算法之前研究类似的算法。 例如,总共有两门课程,每组两名学生,算法应该将学生分组,使学生a在学科1中表现优秀,而学生b在学科b中应该是好的。

详细说明: 输入将采用以下形式:

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|

其中每一行对应一组两名学生。

2 个答案:

答案 0 :(得分:2)

这很容易。我只告诉你算法。

  
      
  1. 制作两个TreeMap。一个是考试中所有分数的,另一个是 lab 中的所有分数。使用学生ID 作为
  2.   
  3. 现在从每个TreeMap的第一个索引开始,然后选择

         

    2.1。如果两个具有相同的,则选择下一个键选择两个不同的并从地图

  4.   

一个例子可能有所帮助。假设场景如下所示

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)

我试着建议你一个帕累托最优算法:

  • 构建一棵树
  • 第一个节点是关于选择群组的数量:例如,如果你有10个学生,你可以拥有4个小组:{3,3,2,2}到5:{2,2,2, 2,2}。这样,在这个简单的例子中,第一个节点只有两个儿子,一个有4个组,一个有5个组。
  • 您开始使用较少的组扩展节点,并生成所有可能的组合(不重复)。
  • 例如,您生成组合{3,3,2,2}。从这里开始按顺序分配学生并生成另一个节点:从学生s1 {{s1 ,,},{,,},{,},{,}}开始,然后添加s2:{{s1,s2 ,},{,,},{,},{,}}等。每次到达最终节点时,都会计算解决方案的值。值的一个例子可以是组之间的平均差异的总和,对于主题和组件进行区分(或者如果您愿意,可以在实验室和考试中进行加权求和)。例如,每个主题有两个主题和两个组件,您将拥有4个无法比较的值。解决方案类似于{ D1 D2 D3 D4 },其中值 Dn 是值 n 的组之间的平均距离。
  • 如果解决方案是Pareto optimal或是唯一可用的解决方案,则将其添加到可行解决方案集中。每次获得解决方案时,都必须将其与解决方案集中的所有解决方案进行比较。如果此解决方案的解决方案支配,则必须将其从集合中删除。
  • 最后,您将拥有一套帕累托有效的解决方案供您选择。可以通过应用一些solution concept来完成选择,在这种情况下我会使用社会效率,这意味着从帕累托前沿中选择最小化所有值中差异总和的解决方案。这意味着SocialValue = -(*D1*+*D2*+*D3*+*D4*)。请注意标志减去:这是因为您必须最大化SocialValue,这是值总和的最小化。