我的一位老师是一名教师,班上有23名学生。他们想要一种算法,在14周内为学生分成2组和3组(处理奇数学生),这样在14周内没有两对重复(一对被分配到一周)。
蛮力方法效率太低,所以我在考虑其他方法,矩阵表示听起来很吸引人,图论。有没有人有任何想法?我能找到的问题只涉及1周和this answer我可以理解。
答案 0 :(得分:9)
Round-robin algorithm会做我认为的伎俩。
将剩余的学生添加到第二组,您就完成了。
First run
1 2 3 4 5 6 7 8 9 10 11 12
23 22 21 20 19 18 17 16 15 14 13
Second run
1 23 2 3 4 5 6 7 8 9 10 11
22 21 20 19 18 17 16 15 14 13 12
...
答案 1 :(得分:1)
另一种可能性可能是graph matching,需要14种不同的图形匹配。
答案 2 :(得分:-1)
尝试用约束来描述问题。
然后将约束传递给ECLiPSe(而不是Eclipse)之类的工具,请参阅http://eclipseclp.org/。
事实上,您的问题似乎与该网站上的Golf示例类似(http://eclipseclp.org/examples/golf.ecl.txt)。
答案 3 :(得分:-1)
从包含所有其他学生的每个学生开始,使用一组(可能是学生的比特集映射,以减少内存消耗)。迭代14次,每次挑选11名学生(对于您将组建的11个小组),您将选择合作伙伴。对于每个学生,选择他们尚未加入团队的合作伙伴。对于那些11的随机学生,选择第二个合作伙伴,但确保没有学生剩余的合作伙伴比剩下的迭代少。对于每个选择,调整集。
答案 4 :(得分:-1)
这是Haskell中的一个例子,它将生成14个非重复11对组合的组。值“对”是从1到23的对的所有组合(例如,[1,2],[1,3]等)。然后程序构建列表,其中每个列表是14个11对的列表(从值'对'中选择),使得没有重复对,并且在11对的一个列表中没有重复单个数字。您可以根据自己的需要,简单地将失踪的最后一名学生放在每周。 (在开始输出结果之前计算大约花了三分钟):
import Data.List
import Control.Monad
pairs = nubBy (\x y -> reverse x == y)
$ filter (\x -> length (nub x) == length x) $ replicateM 2 [1..23]
solve = solve' [] where
solve' results =
if length results == 14
then return results
else solveOne [] where
solveOne result =
if length result == 11
then solve' (result:results)
else do next <- pairs
guard (notElem (head next) result'
&& notElem (last next) result'
&& notElem next results')
solveOne (next:result)
where result' = concat result
results' = concat results
输出中的一个样本:
[[[12,17],[10,19],[9,18],[8,22],[7,21],[6,23],[5,11],[4,14],[3,13],[2,16],[1,15]],
[[12,18],[11,19],[9,17],[8,21],[7,23],[6,22],[5,10],[4,15],[3,16],[2,13],[1,14]],
[[12,19],[11,18],[10,17],[8,23],[7,22],[6,21],[5,9],[4,16],[3,15],[2,14],[1,13]],
[[15,23],[14,22],[13,17],[8,18],[7,19],[6,20],[5,16],[4,9],[3,10],[2,11],[1,12]],
[[16,23],[14,21],[13,18],[8,17],[7,20],[6,19],[5,15],[4,10],[3,9],[2,12],[1,11]],
[[16,21],[15,22],[13,19],[8,20],[7,17],[6,18],[5,14],[4,11],[3,12],[2,9],[1,10]],
[[16,22],[15,21],[14,20],[8,19],[7,18],[6,17],[5,13],[4,12],[3,11],[2,10],[1,9]],
[[20,21],[19,22],[18,23],[12,13],[11,14],[10,15],[9,16],[4,5],[3,6],[2,7],[1,8]],
[[20,22],[19,21],[17,23],[12,14],[11,13],[10,16],[9,15],[4,6],[3,5],[2,8],[1,7]],
[[20,23],[18,21],[17,22],[12,15],[11,16],[10,13],[9,14],[4,7],[3,8],[2,5],[1,6]],
[[19,23],[18,22],[17,21],[12,16],[11,15],[10,14],[9,13],[4,8],[3,7],[2,6],[1,5]],
[[22,23],[18,19],[17,20],[14,15],[13,16],[10,11],[9,12],[6,7],[5,8],[2,3],[1,4]],
[[21,23],[18,20],[17,19],[14,16],[13,15],[10,12],[9,11],[6,8],[5,7],[2,4],[1,3]],
[[21,22],[19,20],[17,18],[15,16],[13,14],[11,12],[9,10],[7,8],[5,6],[3,4],[1,2]]]