一連の制約が与えられたセミランダムな組み合わせ/順列の数


8

バックグラウンド:

私が働いている寄宿学校には約60人の生徒がいます。カウンセラーは私の同僚と私に、手よりも夕食のための座席配置を考え出すより良い方法を考え出すように頼みました。彼は残りの学年度の宿題を希望しています。また、学生や教職員から聞いた問題のいくつかを解決するように依頼してくれました。

制約:

  • ほとんどの学生はアメリカ出身ではないので、同じ国籍の人々に囲まれているとき(つまり、夕食の席で)、英語を練習する代わりに、流暢な言語を話します。
  • 学生が特定のテーブルに全体的に「多すぎる」回数座っていると、不満が出ます。
  • または、同じテーブルに2回以上続けて座っている場合、
  • そして、何人かの生徒は仲良くしないので、一緒に座ることができません。

入力:

実行時に、プログラムには以下が提供されます。

  • 一組の人々、
  • テーブルのセット、および
  • 各テーブルの座席数は異なります(繰り返しが可能です)

両方のセットのサイズ、および各テーブルのサイズは、割り当てごとに変わりません。

テスト:

私はさまざまな国籍の18人と、サイズ3〜6の4つのテーブルを使用しています。私はそのデータセットに意味があると思う数を選びました:

  • 同じ国籍の人が同時に座ることができるのは3人までです
  • 誰もテーブルに4回以上座ることができません

結果:

入力データを変更せずにジェネレータを約15回実行しました。毎回、6〜12週間の割り当てがあります。

質問:

(重要度の低いものから)

  1. プログラムを実行するたびに、生成される割り当ての数が異なるのはなぜですか?データセットは実行間で変化していません。
  2. どうやって見つけるのですか...
    • 特定のテーブルに座ることができる同じ国籍の最小人数、
    • 彼らが与えられたテーブルに着席する全体的な最小回数
    • 生成された割り当ての数を最大化しますか?
  3. これらが実際に正しい数であることをどのように保証しますか?

編集:

新しい課題を生成するたびにCollections.shuffle(List)、人のリストを呼び出して順序をランダム化します。次に、テーブルと人のリストを、github でのkapilidの8つのクイーンの実装に基づくバックトラッキングメソッドに渡して、人をテーブルに割り当てます。


正直なところ、あなたはmathematics.seを試すかもしれません、これはいくつかのかなり複雑な数学です。
Ryathal

@MatthewDあなたの質問はここで結構です、そしてあなたはすでに答えを見つけたので、なぜそれを移行する必要があるのか​​わかりません。より数学的な答えが必要な場合は、Mathematicsに再投稿できますが、質問をサイトに適したものにしてください(詳細については、FAQを参照してください)。コピーして貼り付けないでください。通常、複数のサイトで同じ(または非常に類似したバージョンの)質問をするのは好きではありませんが、両方のサイトであなたの質問が話題になっているようです。最小限の変更で数学を処理できます。
yannis

回答:


4

更新:

私はあなたの質問に直接答えていないことに気づきました。答えを出す前にすべての質問を読むことは役立つと思います...

  1. 座席配置を生成するために使用しているアルゴリズムを指定しません。おそらく、期間の間に異なる割り当てを作成するために、変動性/ランダム性の要素がいくつかあります。そのランダム性が、実行ごとに異なる結果を得る理由である可能性が最も高いです。私はそれをworking as designedバグの代わりとしてマークします。

  2. a。アルゴリズムを指定しないため、実際にはわかりません。また、国籍ごとの数もわかりません。単純なロジックでは、0または1はテーブルでの絶対最小値になりますが、それはあまり役に立ちません。最終的には、それは各国籍の数と、それらが他のテーブルにどのように入力するかによって異なります。
    b。プログラムを実行し、結果をデータベースまたはスプレッドシートに入れて、カウントしてください。または、それらを追跡するようにプログラムを変更します。
    c。ここでの答えは、各国籍の数とあなたが提供した他の制約に依存します。テーブルのサイズも影響します。この部分に対する答えは、実際には潜在的な順列の数の乗算にすぎません。幸い(私にとって)これは、統計ではなくプログラミングに関するサイトです。

  3. ここで取り組むべき2つの問題があります。まず、制約が状況の現実を正確に反映していることを検証します。カウンセラーに相談して、制約が正しいことを確認してください。次に、結果が制約を満たしていることを確認します。返された座席表をチェックして、指定した制約を確認するいくつかのメソッドを記述します。または、手動でチャートを調べて、問題がないことを確認します。


このSO質問には同様の質問があり、これがビンパッキング問題またはナップサック問題と同等であることを示唆しています

優先順位付けされたパラメーターに基づくこのSO質問シートのゲストは、あなたが探しているものに正確に対応しているようです。

このSO質問では、ビンパッキングアルゴリズムを使用してこの問題を解決する際に著者が抱えていた問題について説明します。回答を読んでそれらを回避する方法をより深く理解することをお勧めします。

また、必須のxkcdリファレンスについては、座席プランの最適化について議論するフォーラムからのリンクと、修正された遺伝的アルゴリズムを使用して問題を解決するためのリンクを以下に示します

これが実際のシナリオである場合は、幸運を祈ります。そして、これが宿題だけの場合、あなたはあなたを前進させるのに十分以上の材料を手に入れました。


リンクありがとうございます!:)(割り当てを生成する方法については、編集内容を参照してください)
Matthew D

@MatthewD-あなたが見ている/質問しているランダムさは意図的で期待されているようです。他の制約がなければ、60があります。テーブルの作成に使用している学生名簿の順列。他の制約は順列の最大数を削減しますが、それはかなり大きな出発点です。

あなたが与えたこのリンクは、「望ましくないメンバーが最も少ないピックテーブル」を提案しました。私はそれをしました、そしてそれは今私が何週間もそれを生成するように言っても、一貫してソリューションを生成しています。私はそれをどのように実装したかを試し、完全な一致を見つけることができなかった回数を調べますが、これまでのところ、それは機能しているようです。どうもありがとうございました!
Matthew D

SOの質問の回答の1つは、それがNPの難しい問題であると述べており、これは「(完全に)解決できない場合がある」という礼儀正しい言葉です。それがあなたが遭遇することになる場合は、問題をだまして問題を解決し、カウンセラーにそのことを伝えて、先に進むことができます。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.