16

私はしばしば大規模な入門プログラミング クラス (400 人から 600 人の学生) を教えています。試験の時期になると、全員が試験を受けられるようにクラスを別々の部屋に分割する必要があることがよくあります。

物事を論理的に単純にするために、私は通常クラスを姓で分けます。たとえば、姓が A ~ H の生徒を 1 つの部屋に、姓が I ~ L の生徒を 2 番目の部屋に、M ~ S を 3 番目の部屋に、T ~ Z を 4 番目の部屋に送ることができます。

これを行う際の課題は、部屋の定員が大きく異なることが多く、全員が収まるようにクラスを分割する方法を見つけるのが難しい場合があることです. たとえば、姓の分布が (簡単にするために) 次のようになっているとします。

  • Aで始まる姓:25
  • Bで始まる姓:150
  • Cで始まる姓: 200
  • Dで始まる姓:50

収容人数が 350、50、および 50 の部屋があるとします。部屋の割り当てを見つけるための貪欲なアルゴリズムは、部屋を収容人数の降順に並べ替えてから、その順序で部屋を埋めようとすることかもしれません。残念ながら、これは常に機能するとは限りません。たとえば、この場合、正しいオプションは、姓 A をサイズ 50 の部屋に入れ、姓 B ~ C をサイズ 350 の部屋に入れ、姓 D をサイズ 50 の別の部屋に入れることです。姓 A と B を 350 人の部屋に入れ、他の全員の席を見つけることができません。

この問題は、部屋の順序付けのすべての可能な順列を試してから、各順序付けで欲張りアルゴリズムを実行するだけで簡単に解決できます。これにより、機能する割り当てが見つかるか、存在しないことが報告されます。ただし、部屋の数が 10 から 20 の間であり、すべての順列をチェックするのは現実的ではない可能性があるため、これを行うためのより効率的な方法があるかどうか疑問に思っています。

要約すると、正式な問題ステートメントは次のとおりです。

クラス内の学生の姓の頻度ヒストグラムと、部屋とその定員のリストが表示されます。あなたの目標は、各部屋に連続した文字のブロックが割り当てられ、その容量を超えないように、姓の最初の文字で生徒を分割することです。

これには効率的なアルゴリズムがありますか、または妥当な部屋サイズに対して効率的な少なくとも 1 つのアルゴリズムはありますか?

編集:多くの人が連続した状態について尋ねてきました. ルールは

  • 各部屋には、最大でも連続した文字のブロックを割り当てる必要があります。
  • 2 つ以上の部屋に文字を割り当てることはできません。

たとえば、A - E、H - N、および P - Z を同じ部屋に入れることはできません。また、A ~ C を 1 つの部屋に、B ~ D を別の部屋に配置することもできません。

ありがとう!

4

4 に答える 4

2

この問題はNP-Completeであり、したがって、これに対する既知のpolynomial時間 (効率的な) 解決策はありません (人々が証明できない限りP = NP)。ナップザックまたはビンパッキングの問題のインスタンスを問題に還元して、それが であることを証明できますNP-complete

これを解決するには、0-1 ナップザック問題を使用できます。方法は次のとおりです: 最初に最大の教室サイズを選択し、できるだけ多くの生徒のグループを割り当てるようにしてください (0-1 ナップザックを使用)、つまり、部屋のサイズと同じです。これは0対1のナップサックであるため、学生のグループを分割しないことが保証されています。完了したら、次に大きな教室を受講して続行します。

(既知のヒューリスティックを使用して、0-1 ナップザック問題を解決します。)

これが削減です -- 0 ~ 1 のナップザックの一般的なインスタンスを、問題の特定のインスタンスに削減する必要があります。それでは、0-1 ナップザックの一般的な例を見てみましょう。重みが である袋を取りWましょう。x_1, x_2, ... x_nグループがあり、対応する重みはw_1, w_2, ... w_nです。

ここで削減 --- この一般的なインスタンスは、次のように問題に削減されます。座席数のある教室が 1 つありますW。それぞれx_i (i \in (1,n))は、最後のアルファベットが で始まりi、その数 (別名グループのサイズ) の学生のグループですw_i

これで、0-1 ナップザック問題の解があるかどうか、問題に解があるかどうかを証明できます...そしてその逆も....また、0-1 ナップザックに解がない場合、問題には解がありません。およびその逆。

NP-C既知の問題の一般的なインスタンスを、問題の特定のインスタンスに還元するという重要なことを覚えておいてください。

お役に立てれば :)

于 2013-05-04T17:59:21.383 に答える
0

これは、イニシャルごとの姓の分布に関する一般的な仮定を考えると、かなりうまく機能するはずのアプローチです。バックトラックなしで、制約内で最小容量から最大容量まで部屋をできるだけコンパクトに埋めます。

まだリストされていない「他のすべての人」のためであるため、最大の部屋が最後にリストされることは(少なくとも私には)合理的だと思われます。

于 2013-05-04T19:23:52.780 に答える