0

要約:
登録されているモジュールを選択します。
各モジュールには多数のグループがあります。
各グループは、特定のモジュールの講義を表します。
各組み合わせには、各モジュールから 1 つのグループのみを含める必要があります。

例:
COS 121 -3 グループ
COS 132 -2 グループ

これにより、[1,1]、[1,2]、[2,1]、[2,2]、[3,1]、[3,2] の 6 つのオプションが得られます。

私の角度: 各組み合わせを使用して時刻表を生成する必要があるため、現在使用されているグループとグループの総数を格納する配列を使用します。arrSubjects[subject,currentGroup,maxGroups]

論理的には、この配列を繰り返し処理して、グループの各組み合わせを利用できるはずです。

間違った角度を使用しているためか、このソリューションを把握できません。どんな助け/提案も本当に感謝しています。

私の現在の実装: 時間がかかるため、これについては非常に恥ずかしいですが、うまくいきます。疑似コードの基本は次のとおりです。

for (all the groups multiplied with eachother) do {
  for (all the modules selected) do {
    Select a random group between 1 and the nmr of groups 
  }
}

その後、すべての重複を取り除く必要があります。

前もって感謝します

私が現在取り組んでいるコード:

arrPermutations[0,0]:=1;//Current group for 1st module
arrPermutations[0,1]:=3;//Max groups for 1st module
arrPermutations[1,0]:=1;
arrPermutations[1,1]:=3;
arrPermutations[2,0]:=1;//Current group for 3rd module
arrPermutations[2,1]:=3;//Max groups for 3rd module
iCurrent:=iMax; //2
while (arrPermutations[0,0]<=arrPermutations[0,1]) do
begin
//Display arrPermutations
if arrPermutations[iCurrent,0]=arrPermutations[iCurrent,1] then
begin
  Inc(arrPermutations[iCurrent-1,0]);
  for i := iCurrent to iMax do
    arrPermutations[i,0]:=1;
  iCurrent:=iMax;
end else
begin
  Inc(arrPermutations[iCurrent,0]);
end;
end;

現在、最後の 2 つのグループのみをトラバースしています。チェックしたときに得られる出力は次のとおりです:
============Run 1==============
module,current group,max groups
1,1,3
2, 1,3
3,1,3
============実行 2==============
モジュール、現在のグループ、最大グループ
1,1,3
2, 1,3
3,2,3
============実行 3==============
モジュール、現在のグループ、最大グループ
1,1,3
2, 1,3
3,3,3
============実行 4==============
モジュール、現在のグループ、最大グループ
1,1,3
2, 2,3
3,1,3
============実行 5==============
モジュール、現在のグループ、最大グループ
1,1,3
2, 2,3
3,2,3
============実行 6==============
モジュール、現在のグループ、最大グループ
数 1,1,3
2,2,3
3,3,3
============実行 7==============
モジュール、現在のグループ、最大グループ
数 1,1,3
2,3,3
3,1,3
============実行 8==============
モジュール、現在のグループ、最大グループ
数 1,1,3
2,3,3
3,2,3
============実行 9==============
モジュール、現在のグループ、最大グループ
数 1,1,3
2,3,3
3,3,3
============Run 10==============//////ここに問題の
モジュール、現在のグループ、最大グループ
1,1,3 があります
2,4,3
3,1,3

4

1 に答える 1

1

新しい答え:

まず、可能な組み合わせの数は、各モジュールのグループ数の積です。たとえば、それぞれ5、2、および7つのグループを含む3つのモジュールがある場合、5 * 2 * 7=70の可能な組み合わせがあります。これをTOTALCOMBOSと呼びます。

したがって、考えられるすべての組み合わせを反復処理する場合は、0からTOTALCOMBOS-1までループするだけです。

for I in 0..TOTALCOMBOS-1 do
    COMBO = (convert I to a combination)
    (do something with COMBO)

ここで、インデックスを組み合わせに変換するには、整数インデックスを右から左への「数字」のリストと考えると役立ちます。これは、モジュールごとに10個のグループがあり、グループ番号が1ではなく0から始まるかどうかを確認するのが最も簡単です。次に、整数468をリスト(8,6,4)として読み取ることができます。これは、モジュール1のグループ8を意味します。モジュール2のグループ6、およびモジュール3のグループ4。擬似コードでは、インデックスを組み合わせに変換すると、次のようになります。

DIGITS = I
for M in 1..(number of modules) do
   D = DIGITS mod (number of groups in module M)
   DIGITS = DIGITS / (number of groups in module M)
   (add group D from module M to the current combination)

グループ番号を0ではなく1から開始する場合は、最後の行でグループDの代わりにグループD+1を使用します。

古い答え:

再帰を使用します。再帰関数は、モジュールのリストを取得し、組み合わせのリストを返すことができます。各組み合わせには、入力リストの各モジュールからの1つのグループが含まれます。

基本ケースとして、モジュールのリストが空の場合は、組み合わせの空のリストを返します。

それ以外の場合は、Mを最初のモジュールとし、RESTを残りのモジュールとします。RESTで再帰関数を呼び出して、残りのモジュールのすべての組み合わせを取得します(この組み合わせのリストをCOMBOSと呼びます)。COMBOSのこれらの組み合わせには、Mのグループが含まれていないことに注意してください。

次に、すべての組み合わせのリストを作成します。今回はMのグループを含みます。リストを初期化して、空にします。2つのネストされたループを使用します。Mの各グループG、およびCOMBOSの各組み合わせCについて、GをCに追加し、この拡張された組み合わせをANSWERSに追加します。

回答を返します。

(前提条件:複数のモジュールまたは同じモジュールに2回表示されるグループはありません。モジュールのリストに複数回表示されるモジュールはありません。必要に応じてこれらの前提条件を緩和できますが、必要なものを定義する必要があります。これらの場合の動作。)

(コメント1:上記の「リスト」と言いましたが、これらのリストはすべて、配列または他の種類のコンテナーである可能性があります。)

(コメント2:「GをCに追加する」と言った場合、C自体は変更しないことが重要です。CはMのグループごとに1回ずつ、何度も再利用されるためです。)

于 2012-06-26T12:48:48.877 に答える