タスクを自動化しようとしていますが、正しいアルゴリズムを検索するための適切な語彙が不足しています。これは、以前に何度も解決された可能性のある一般的な問題のように感じます。
私が探しているのは、誰かが私を正しい方向に向けるか、適切な検索用語を使って解決策/アルゴリズムを探すのを手伝ってくれることです。たまたま実際のライブラリ(JavaScript)を知っていれば、さらに良いでしょう。
3つの「バケット」があるとしましょう、Bucket A
、Bucket B
およびBucket C
。これらはそれぞれ、特定の数の「ボール」を保持できます。
Bucket A
:容量10ボール。Bucket B
:容量15ボール。Bucket C
:容量5ボール。今、私はボールの在庫も持っており、各ボールは特定の「バケット」にしか入れることができません。 1つのボールはBucket 2
、次のボールはBucket 1
OR Bucket 3
、 等々。
さて、それぞれの「バケット」をその容量(または可能な限り近く)まで満たすために、ボールを配置する最良の方法を決定する必要があります。
これの私の本当の理由は、people
(ボール)がlocations
(バケット)に要求された時間(バケットの容量)を訪問するようにスケジュールすることです。ただし、次の理由により、「スケジューリング」を検索しているときに見つけたすべてのライブラリ/アルゴリズムは、私のシナリオでは機能しません。
person
-> location
のみlocation
で過ごすことができる任意の整数(整数)時間利用できます。 8時間利用できる人を、そのうちの7時間だけ使用してもかまいません。私は〜50の場所と〜100人を持っています。私が完璧なソリューションを取得することは要件ではありませんが、「かなり近い」です。
私は schedule.js を見つけました。これは素晴らしいように見えますが、自分のニーズに合わせて乱用することはできませんでした。
各人が利用できる時間数が一定である場合(たとえば、それは常に1時間です)、問題は ネットワークフロー としてモデル化でき、多項式時間で Ford-Fulkerson'sアルゴリズム 。
フローネットワークを構築するには、ノードの2つのレイヤーを作成します。最初のレイヤーはボールを表し、2番目のレイヤーはバケットを表します。容量1の各ボールにソースからエッジを追加します。容量1の互換性のある各バケットに各ボールからエッジを追加します。バケット容量に対応する容量の各バケットからシンクにエッジを追加します。最大フローは最適な割り当てを表します。
それ以外の場合、各人が貢献できる時間数が異なる場合、上記のアルゴリズムは、各人が1つの場所しか訪問できないという制約のために機能しません。 (ネットワークフローは問題を解決しますが、1人の時間を複数の場所に分割する可能性があります。)この場合、 ナップザック または ビンパッキング 問題に関連するものがあります。
各人が貢献できる時間数が整数である場合、疑似多項式動的プログラミングを介してそれを解くことができます。それ以外の場合は、次のいずれかを行う必要があります。