你可以把这个问题看成一个图问题:通过一组不相交的子图覆盖一个二分图,同时尊重两个分区(学生、组)并最大化一个分区的覆盖(学生)
我正在考虑这个启发式:
- 从一个空的解决方案开始
- 虽然有未分配的学生和开放(少于六个成员)组:
- 按空闲位置的顺序对未分配的学生进行排序
- 从列表顶部挑选六名学生(从顶部开始阅读列表,直到找到六名学生可以参加的小组)并将他们作为一个小组使用。
- 如果您不能选择六个学生,请选择尽可能多的学生。
- 如果你找不到三个学生组成一个小组,但你有两个:
- 为该组找到第三个学生,该学生当前分配到您可以从(超过三个人)带走的组中,并使用他来填充该组。首选可以从未分配集中重新填充的组
- 如果您找不到第三个人,请从不同的 3 人小组中选择一个。在该组中递归搜索他的替代者(或放弃)。您可以尝试同时从不同的三人组中移除。
- 如果你只有一个学生,看看你是否可以让其他小组的另外两个人填补他的任何一个小组。如果需要,递归替换它们或放弃。
- 如果您有一个学生的所有候选组都已满,请在这些组中的任何一个不能移动到未满组的人中寻找一个人。如果所有替换组都已满,则递归。
- 如果您无法找到一种方法来调动人员以满足任何未分配的学生,请完成
请注意,这归结为:
快速找到满足大多数人的解决方案(您可以在这里停下来)。然后尝试通过找到一系列配对来插入学生:
- 在已使用和未使用的配对之间交替
- 从学生开始
- 在一堂课结束
请注意,这与在二分图中寻找交替路径是同构的,并且可以这样优化。
请注意,这可能仍然无法找到最佳解决方案,因为它永远不会替换单个组中的多个人来满足一个人。
上面的伪代码指示在每一步都使用学生列表。相反,您可以跟踪对此列表的更改并在进行更新时更新排序顺序。
更新:我没有注意到你也想指派老师。
在这种情况下,您需要在将学生分配到组时将教师分配到组。这将阻止创建某些组,但是如果没有空闲的老师,您可以从不同的组中选择老师,如果您可以为该组分配不同的老师。同样,它只是在寻找一个交替图,这次是在教师组子图中——让学生四处移动以腾出教师似乎并不可行。
您现在要覆盖的整个图表具有三个分区:学生、教师、组。老师和学生不互动,所以有两层:学生-小组,小组-老师。这两个层是独立的,除非它们必须覆盖同一组组。