具体的分组算法

时间:2013-01-07 18:41:20

标签: algorithm grouping

我正在编写一个程序,根据学生和导师的可用性来组建辅导小组。可用性在由字母表示的阻塞时间列表中给出。例如,如果学生将其作为[A,C,D]的可用性,则他在一天的第一,第三和第四个小时内可用。你如何制作一个能够列出学生名单和导师名单的功能,并提供一组最大化学生人数的小组列表?我在Java工作,但我对算法比对代码本身更感兴趣。更多细节:

小组必须包含3-6名学生和1名导师。

学生只能在一个小组中。

学生满意(放在一个小组中)的人数必须最大化。 例如,假设我们有1-6名学生和两名导师,他们都在A和B时间可用。学生可以在1:A,2:A,3:A,4:AB,5:AB,6获得: B.该算法应返回两组:[1,2,3,tutor1]和[4,5,6,tutor2]。这将每个学生分配到一些小组,并且更可取的是,将1-5组成一组并留下6名。

2 个答案:

答案 0 :(得分:1)

以下是帮助您入门的3个想法。

  1. 贪心算法。将列表中的第一个学生与列表中的第一个兼容导师匹配。将列表中的第二个学生与列表中的第一个兼容导师进行匹配。等

  2. 找到最“流行”的可用小时,并先与该小时匹配。然后是下一个最受欢迎的等等。

  3. 找到最少的“热门”可用小时,并先与该小时匹配。然后是最不受欢迎的等等。

  4. 免责声明:我假设您正在开展一些学习/爱好/管理方便的工作,换句话说,您的项目没有太多的利润。如果我的假设是错误的,我建议您需要更多地研究算法,或聘请具有专业知识的人。

答案 1 :(得分:1)

您可以将此问题视为图形问题:通过一组不相交的子图覆盖二分图,同时尊重两个分区(学生,组)并最大化一个分区(学生)的封面

我正在考虑这种启发式方法:

  • 以空解决方案开始
  • 虽然有未分配的学生和开放(少于六个成员)组:
    • 按照空闲时段的顺序对未分配的学生进行排序
    • 从列表顶部挑选六名学生(从顶部读取列表,直到找到六名学生可以参加的小组)并将其作为一组使用。
    • 如果你不能挑选六名学生,请选择最多的学生。
    • 如果你找不到三个组成学生的学生,但你有两个:
      • 找到该组的第三名学生,该组目前已分配给您可以从中获取的组(超过三人),并使用他来填充该组。首选可以从未分配的集合
      • 重新填充的组
      • 如果找不到第三个人,请从另一个3人小组中取一个人。在该组中递归搜索他的替换(或放弃)。您可以尝试并行删除不同的三个成员组。
    • 如果您只有一名学生,请查看是否可以由其他两组其他人填写他的任何小组。如果需要,递归替换它们或放弃。
    • 如果您的学生的所有候选人群已满,请在其中任何一个人中寻找无法移动到非完整群组的人。如果所有替换组都已满,请递归。
    • 如果你找不到办法让人们转移以满足任何未分配的学生,请完成

请注意,这归结为:

快速找到满足大多数人的解决方案(你可以在这里停下来)。然后尝试通过找到一系列配对来插入学生:

  • 在已使用和未使用的配对之间交替
  • 从学生开始
  • 以课程结束

请注意,这与在二分图中找到交替路径是同构的,并且可以进行优化。

请注意,这可能仍然无法找到最佳解决方案,因为它永远不会替换单个组中的多个人来满足一个人。

上面的伪代码指示在每一步都要求学生名单。相反,您可以跟踪对此列表的更改,并在进行更新时更新排序顺序。


更新:我没有注意到您也想要分配教师。

在这种情况下,您需要在分配学生时将教师分配给小组。这将阻止创建某些组,但如果没有免费教师,您可以从不同的组中选择教师,如果您可以为该组分配不同的教师。再一次,它只是在寻找一个交替的图形,这次是在教师组子项目中 - 将学生们随意移动以释放教师似乎不可行。

您想要覆盖的整个图表有三个分区:学生,教师,小组。教师和学生不互动,因此有两个层次:学生群体,群体 - 教师。这两个层是独立的,除非它们必须覆盖同一组。