バックグラウンド:
私が働いている寄宿学校には約60人の生徒がいます。カウンセラーは私の同僚と私に、手よりも夕食のための座席配置を考え出すより良い方法を考え出すように頼みました。彼は残りの学年度の宿題を希望しています。また、学生や教職員から聞いた問題のいくつかを解決するように依頼してくれました。
制約:
- ほとんどの学生はアメリカ出身ではないので、同じ国籍の人々に囲まれているとき(つまり、夕食の席で)、英語を練習する代わりに、流暢な言語を話します。
- 学生が特定のテーブルに全体的に「多すぎる」回数座っていると、不満が出ます。
- または、同じテーブルに2回以上続けて座っている場合、
- そして、何人かの生徒は仲良くしないので、一緒に座ることができません。
入力:
実行時に、プログラムには以下が提供されます。
- 一組の人々、
- テーブルのセット、および
- 各テーブルの座席数は異なります(繰り返しが可能です)
両方のセットのサイズ、および各テーブルのサイズは、割り当てごとに変わりません。
テスト:
私はさまざまな国籍の18人と、サイズ3〜6の4つのテーブルを使用しています。私はそのデータセットに意味があると思う数を選びました:
- 同じ国籍の人が同時に座ることができるのは3人までです
- 誰もテーブルに4回以上座ることができません
結果:
入力データを変更せずにジェネレータを約15回実行しました。毎回、6〜12週間の割り当てがあります。
質問:
(重要度の低いものから)
- プログラムを実行するたびに、生成される割り当ての数が異なるのはなぜですか?データセットは実行間で変化していません。
- どうやって見つけるのですか...
- 特定のテーブルに座ることができる同じ国籍の最小人数、
- 彼らが与えられたテーブルに着席する全体的な最小回数
- 生成された割り当ての数を最大化しますか?
- これらが実際に正しい数であることをどのように保証しますか?
編集:
新しい課題を生成するたびにCollections.shuffle(List)
、人のリストを呼び出して順序をランダム化します。次に、テーブルと人のリストを、github でのkapilidの8つのクイーンの実装に基づくバックトラッキングメソッドに渡して、人をテーブルに割り当てます。