我正在写一个程序,以便在学生和导师有空的情况下组成辅导小组。可用性以字母表示的阻塞时间列表的形式给出。例如,如果一个学生以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。
发布于 2013-01-08 03:18:08
下面是帮助你入门的3个想法。
免责声明:我假设你正在做一些关于学习/爱好/管理便利的事情,换句话说,你的项目没有多少钱处于危险之中。如果我的假设是错的,我会建议你学习更多关于算法的知识,或者聘请有专业知识的人。
发布于 2013-01-08 03:46:11
您可以将此问题视为一个图问题:通过一组不相交的子图覆盖二部图,同时尊重两个分区(学生,组)并最大化一个分区(学生)的覆盖。
我在想这个启发式的方法:
H19如果您无法选择六名学生,请尽可能多地挑选。H210H111如果找不到组成一个组的三名学生,但是你有两个:
中的不同三人组中移除
- If you only have one student, see if you can fill any of his groups by two other people from other groups. If needed, replace them recursively or give up.
- If you have a student whose all candidate groups are already full, look for a person in any of these group that can't be moved to a non-full group. If all replacement groups are already full, recurse.
- If you can't find a way to shift people around to satisfy any unassigned student, finish
请注意,这可以归结为:
快速找到一个能让大多数人满意的解决方案(你可以就此打住)。然后,尝试通过找到一系列配对来插入学生:
在
班级
请注意,这与在二部图中寻找交替路径同构,并且可以进行优化。
请注意,这可能仍然无法找到最佳解决方案,因为它永远不会替换单个组中的一个以上的人来满足一个人。
上面的伪代码指示在每个步骤中对学生列表进行排序。相反,您可以跟踪对此列表的更改,并在进行更新时更新排序顺序。
更新:我没有注意到你也想分配老师。
在这种情况下,当您将学生分配到某个组时,需要将教师分配给该组。这将阻止创建某些组,但如果没有空闲教师,如果您可以将不同的教师分配到不同的组中,则可以从不同的组中接收教师。再说一次,它只是在寻找一个交替的图,这一次是在教师组子图中-把学生拖来拖去以释放教师似乎是不可行的。
您想要覆盖的整个图现在有三个分区:学生、教师、组。老师和学生不互动,所以有两个层次:学生-小组,小组-教师。这两个层是独立的,除非它们必须覆盖相同的组集合。
https://stackoverflow.com/questions/14202023
复制相似问题