web-dev-qa-db-ja.com

リソース割り当てのニーズに対応するアルゴリズムを特定する

タスクを自動化しようとしていますが、正しいアルゴリズムを検索するための適切な語彙が不足しています。これは、以前に何度も解決された可能性のある一般的な問題のように感じます。

私が探しているのは、誰かが私を正しい方向に向けるか、適切な検索用語を使って解決策/アルゴリズムを探すのを手伝ってくれることです。たまたま実際のライブラリ(JavaScript)を知っていれば、さらに良いでしょう。

構成シナリオ

3つの「バケット」があるとしましょう、Bucket ABucket BおよびBucket C。これらはそれぞれ、特定の数の「ボール」を保持できます。

  • Bucket A:容量10ボール。
  • Bucket B:容量15ボール。
  • Bucket C:容量5ボール。

今、私はボールの在庫も持っており、各ボールは特定の「バケット」にしか入れることができません。 1つのボールはBucket 2、次のボールはBucket 1 OR Bucket 3、 等々。

さて、それぞれの「バケット」をその容量(または可能な限り近く)まで満たすために、ボールを配置する最良の方法を決定する必要があります。

実際のシナリオ

これの私の本当の理由は、people(ボール)がlocations(バケット)に要求された時間(バケットの容量)を訪問するようにスケジュールすることです。ただし、次の理由により、「スケジューリング」を検索しているときに見つけたすべてのライブラリ/アルゴリズムは、私のシナリオでは機能しません。

  • 開始/終了時間はまったく気にせず、person-> locationのみ
  • 私の人々(ボール)はすべて、訪問できる場所の厳密なリストを持っています。それぞれがユニークです。
  • 各人は、1時間locationで過ごすことができる任意の整数(整数)時間利用できます。 8時間利用できる人を、そのうちの7時間だけ使用してもかまいません。
  • 各ロケーション(バケット)は、特定の時間数を要求します。私は、あらゆる組み合わせの人々と私の能力を最大限に発揮しようとします。

私は〜50の場所と〜100人を持っています。私が完璧なソリューションを取得することは要件ではありませんが、「かなり近い」です。

私は schedule.js を見つけました。これは素晴らしいように見えますが、自分のニーズに合わせて乱用することはできませんでした。

5
Luggage

各人が利用できる時間数が一定である場合(たとえば、それは常に1時間です)、問題は ネットワークフロー としてモデル化でき、多項式時間で Ford-Fulkerson'sアルゴリズム

フローネットワークを構築するには、ノードの2つのレイヤーを作成します。最初のレイヤーはボールを表し、2番目のレイヤーはバケットを表します。容量1の各ボールにソースからエッジを追加します。容量1の互換性のある各バケットに各ボールからエッジを追加します。バケット容量に対応する容量の各バケットからシンクにエッジを追加します。最大フローは最適な割り当てを表します。

それ以外の場合、各人が貢献できる時間数が異なる場合、上記のアルゴリズムは、各人が1つの場所しか訪問できないという制約のために機能しません。 (ネットワークフローは問題を解決しますが、1人の時間を複数の場所に分割する可能性があります。)この場合、 ナップザック または ビンパッキング 問題に関連するものがあります。

各人が貢献できる時間数が整数である場合、疑似多項式動的プログラミングを介してそれを解くことができます。それ以外の場合は、次のいずれかを行う必要があります。

  1. ブルートフォースバックトラッキングアルゴリズムを実装します。これは正確なソリューションを提供しますが、人数または場所の数が50を超える場合は機能しません。
  2. Doc Brownが提案したように、組み合わせヒューリスティック手法を実装します。 ヒルクライミング または シミュレーテッドアニーリング は、この問題に対して非常に優れたパフォーマンスを発揮し、最適またはほぼ最適な結果を非常に迅速に提供します。
3
CaptainCodeman