我正在尝试实施一个应用程序,将学生分配给实验室组中的l个实验室。约束是:
1:学生应与每个实验室的新生一起工作。 2:所有学生一旦成为实验室领导者。
如果学生不能在实验室组中均匀分配,则2无法解决。因此,如果“奇怪”的学生永远不会成为实验室领导者,那是可以接受的。
我尝试了两种方法,但我还不满意。:
禁忌搜索,解决1但解决问题2(我实际上先解决1然后尝试解决2,这可能是错误的方法,任何建议)
一个简单的解决方案,我将#labs中的学生分成一个数组[0..6] [7..14] [15..21],然后旋转(带0,1,2 inc) )并转置矩阵,以递增的旋转(1,2,4)和(2,4,6)重复#labs次。对于实验组为7的3个实验室中的21名学生,结果如下:
实验室领导者是实验室1的第一列,第二列是实验室2 ......
此解决方案效果不错,但例如3个实验室的12名学生或6个实验室的150名学生失败。有什么建议吗?
2似乎处理相同数量的案例或组合,与1相比闪电般快。也许我应该得到一个高贵的价格: - )
答案 0 :(得分:2)
仅限约束#1通常被称为社交高尔夫球手问题。 (让参数g为组的数量,s为每组的大小,w为周数。分组是g * s高尔夫球手分成g组的大小为s。确定是否可以找到w分组每对高尔夫球手最多被组合在一起。)社交高尔夫球手问题已经在组合优化文献中进行了研究,这些方法有三种类型(你可以用自己喜欢的搜索引擎找到研究文章):
本地搜索。当w远低于其最大可行值时,这是有效的。 Dotú and Van Hentenryck有一篇论文将禁忌搜索应用于社交高尔夫球手问题。
完成搜索。当w高于或低于其最大可行值时,这是必要的,但它不能很好地扩展。
代数结构。这就是臭名昭着的g = 8 s = 4 w = 10实例的解决方法。不幸的是,对于许多参数集,没有已知的结构。
要分配实验室负责人,请在学生和实验室小组之间计算maximum matching,如果该学生属于该实验室小组,则学生和实验室小组之间存在优势。