web-dev-qa-db-ja.com

ワークロードを均等に分散するために使用できる関数または方法

これは、アルゴリズムの問​​題よりも数学の問題です。それにもかかわらず、それはphpで実装されます。

N個のタスクの配列があります。各タスクは完了するまでに時間を要しました(たとえば、タスク1は完了するまでに5時間かかりました)。次に、これらのタスクが正しく完了したことを確認するには、特定の数のユーザーUを割り当てて、それぞれを確認する必要があります。各ユーザーには、特定の数のタスクが割り当てられます。理想的には、各ユーザーには、他のユーザーとほぼ同じ時間が割り当てられます。

例えば。 10個のタスクがあります。タスク1は4時間かかり、タスク2は18時間かかり、タスク3は6時間かかりました...合計80時間です。

8人のユーザーがいます。 8人の各ユーザーが理想的には同じ時間数である場合(一部のユーザーはより多くの、より長いタスクを取得し、一部のユーザーはより少ないが、より長いタスクを取得する)、タスクを自動的に並べ替えて割り当てる良い方法は何ですか?

4
John

以下に示すアルゴリズムがソリューションを提供します。私はそれを完全にテストしていませんが、それはあなたにアイデアを与えるはずです。 sum(リソース利用可能時間)> = sum(必要なタスクレビュー時間)の場合にのみ使用できます。

プロセスは、Task1に必要なレビュー時間とリソース1の利用可能な時間を調べることから始まります。利用可能な時間がタスクに必要な時間以下である場合、T1の交差セルU1には、必要なレビュー時間またはユーザー1の利用可能な時間のいずれかを満たす時間数が入力されます。

次に、タスク2に進み、プロセスを繰り返します。

割り当てが特定のリソースの利用可能な時間を使い果たした場合、ロジックは次のリソースに移動します。

この条件に違反した場合、またはすべてのリソースが割り当てられた場合、反復は停止するはずです。

下の図では、ステップ0が最初のステップです。私は、オレンジ色を使用して、各ステップでの変化を示しています。プロセスを発見できることを期待しています。

注:

このプロセスは、ユーザーが左から右にリストされる方法に偏り、作業をユーザー間で均等に分散しません。つまり、1人のユーザーが他のユーザーよりも前に現れるからといって、他のユーザーよりも熱心に作業する可能性があります。

enter image description here

2
NoChance

これは オープンショップスケジューリング 問題のインスタンスです。問題はNP完全であるため、Wikipediaで説明されているヒューリスティックや この論文 の遺伝的アルゴリズムの1つなどのヒューリスティックを適用する必要があります。

1
Fred Foo

おそらく、これを考えすぎているのかもしれません。タスクを単純なキューに配置し、優先順位に従って並べ替えます。各ユーザーに利用可能な最初のタスクを実行させるだけで十分です。タスクが長いほどレビューに時間がかかり、短いほど時間が短くなる可能性があるため、ユーザーが前のタスクを完了して次のタスクに進むにつれて、次のタスクを収集しているように見えるユーザーの順序が変わります。これはあまり複雑にする必要はありません。

事前割り当てタスクには、いくつかの重大な欠点があります。これは基本的にはプッシュシステムであり、多くの場合、「無駄」になる傾向があります。作業見積もりが間違っていたり、チーム内の状況の変化によって中断されたりした場合に同期の問題を管理する必要がなくなるため、プルシステムの実装は、スケジューリングとリソースの点ではるかに効率的で無駄が少なくなります。

0
S.Robins