web-dev-qa-db-ja.com

並列組立ラインスケジューリング(動的計画法)のヘルプ/提案

動的計画法による組立ラインのスケジューリングと同様の問題に取り組んでいます。問題は、ステーションが事前定義されている従来の問題とは異なり、どのタスクを他の(複数の)タスクの前に実行する必要があるかについての情報しかないことです。

プロダクションにかかる合計時間を最小限に抑えるために、どのタスクをどのラインに配置するかを見つける必要があります。したがって、タスクが単一のライン上にある場合、タスクは連続して実行されるため、速度が低下します。

だから私は次の問題を抱えています

  1. すべてのタスクのシーケンスがないので、時間ベースのレベル/ラインを作成するにはどうすればよいですか?私は、どのタスクがどの(1つまたは複数の)タスクの前に来るかしか知りません。時間を最小限に抑える必要があるため、時間ベースのレベルが必要です(これはタスクが並行して実行されるときに発生します)。
  2. 時間を最小限に抑えるために、タスクの最適な順序をどのように決定しますか?複数のタスクが単一のタスクを待機しているため、この時間も最小限に抑える必要があります。
  3. 元の問題と同様に、異なる回線間の通信にもコストがかかります。この通信コストがタスクを(通信タスクから)別の行に移動する価値があるかどうかを判断する必要があります

tl; dr:すべてのラインが同時にビジーであり、ステーションの番号付け/順序付けがない、アセンブリラインスケジューリング(動的プログラミング)の並列バージョン。どのタスクをどの前に実行する必要があるかを知っています。

生産時間を最小限に抑えるために、同じラインに配置するタスクと異なるラインに配置するタスク(タスクが異なるラインにある場合の通信時間を指定)を決定する必要があります。

6
user109405

十分な答えを受け入れる用意がある場合は、組み合わせ最適化問題として扱うことができます。考えられる解決策のツリーをメモリ内に作成します。ツリーの最初のブランチは、使用可能な組立ラインへの次の1つまたは複数のタスクの割り当てです。タスクがシステムに入るときに確立される一連の依存関係に基づいて、「次の」1つまたは複数のタスクを常に把握できます。 「次の」タスクがいくつかある場合は、より大きなタスクを優先することをお勧めします。

ツリーの次の深さのノードは、次のタスクの割り当ての可能性(割り当てられているライン)で構成されています。

これは可能性の爆発につながるため、ツリーが急速に大きくなるため、ツリーを定期的に剪定する必要があります。意味をなさない割り当てがある場合は、それらの割り当てをツリーに追加しないでください。

ツリーが大きくなりすぎた場合、メモリ使用量の観点から、または任意の深さで、ツリーを1つのリーフに整理します。各リーフのコスト(効率)を計算し、最良のものを取得して、他のすべてを破棄します。そのリーフから始めて、新しいブランチのセットなどを計算します。

1
Frank Hileman