n人のクラスでm回の授業をします。毎回l組みのグループに分けますが、なるべく同じ人と同じグループにならないようにしたい。
この組み分けを、Excelもしくはvbaで自動生成したいと思っています。良い知恵があればお教えください。
確かに難しい問題なので、どなたも回答されてないようなので、やや不完全ですが道筋(アルゴリズム)を説明します。
はじめに、n=6でl=3のケースで説明します。
1)6の分割数のケースをだします(p(6)=11通りあります)
6,5+1,4+2,4+1+1,3+3,3+2+1,3+1+1+1,2+2+2,2+2+1+1,2+1+1+1+1,
1+1+1+1+1+1
2)上記ケースでl=3組に分かれたケースを選別します
4+1+1,3+2+1,3+1+1+1,2+2+2
3)すべての要素が[6/3]=2以上からなるケースを選別します。
[]はガウス記号です。これは「なるべく同じ人数」を満たす条件です。
2+2+2
4)6人を2,2,2に分ける組み合わせを計算します
6C4*4C2*2C2=6!/(4!2!)×4!/(2!2!)×2!/(2!0!)=30
m回が30以下であれば、毎回異なるペアを作れます。具体的なメンバーの対は集合演算すれば生成できるでしょう。また、mが30より大であるとメンバが同じグループが出来てしまうのは不可避です。
これをより一般的に表現すると
1)nの分割をリストアップする(自然数の分割に従う)
2)l個に組み分けされた分割ケースを抽出します(l個の要素の分割を選ぶ)
3)上記分割で[n/l]以上の要素からなるケースを選別します。仮に(a,b,c,d...)とします
4)n人を(a,b,c,d...)に分ける組み合わせ数を出します(組み合わせ数を計算する必要は必ずしも無いですが、m回以上かどうかのチェックにはなります)
5)組み合わせを作成します
Excel実装は該当する関数がないので苦しいです。とくに自然数の分割パターンは自分でVBAプログラムする必要があります。下記サイトの問題93が参考になるでしょう。
http://www.geocities.jp/m_hiroi/func/yasp06.html
その他参考
コメント(5件)
ということは 最初にグループAとグループBに それぞれ2人を 割り当てればいいだけですね。
あとは テキトーに割り当てれば いいだけです。
これ難しいよ。
難しいなあ。