我正在编写一个程序,根据学生和导师的可用性来组建辅导小组。可用性在由字母表示的阻塞时间列表中给出。例如,如果学生将其作为[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名。
答案 0 :(得分:1)
以下是帮助您入门的3个想法。
贪心算法。将列表中的第一个学生与列表中的第一个兼容导师匹配。将列表中的第二个学生与列表中的第一个兼容导师进行匹配。等
找到最“流行”的可用小时,并先与该小时匹配。然后是下一个最受欢迎的等等。
找到最少的“热门”可用小时,并先与该小时匹配。然后是最不受欢迎的等等。
免责声明:我假设您正在开展一些学习/爱好/管理方便的工作,换句话说,您的项目没有太多的利润。如果我的假设是错误的,我建议您需要更多地研究算法,或聘请具有专业知识的人。
答案 1 :(得分:1)
您可以将此问题视为图形问题:通过一组不相交的子图覆盖二分图,同时尊重两个分区(学生,组)并最大化一个分区(学生)的封面
我正在考虑这种启发式方法:
请注意,这归结为:
快速找到满足大多数人的解决方案(你可以在这里停下来)。然后尝试通过找到一系列配对来插入学生:
请注意,这与在二分图中找到交替路径是同构的,并且可以进行优化。
请注意,这可能仍然无法找到最佳解决方案,因为它永远不会替换单个组中的多个人来满足一个人。
上面的伪代码指示在每一步都要求学生名单。相反,您可以跟踪对此列表的更改,并在进行更新时更新排序顺序。
更新:我没有注意到您也想要分配教师。
在这种情况下,您需要在分配学生时将教师分配给小组。这将阻止创建某些组,但如果没有免费教师,您可以从不同的组中选择教师,如果您可以为该组分配不同的教师。再一次,它只是在寻找一个交替的图形,这次是在教师组子项目中 - 将学生们随意移动以释放教师似乎不可行。
您想要覆盖的整个图表有三个分区:学生,教师,小组。教师和学生不互动,因此有两个层次:学生群体,群体 - 教师。这两个层是独立的,除非它们必须覆盖同一组。