私はこの問題の単純なバージョンの多数の解決策を調査しましたが、すべての可能な順列をソートすることを除いて、高度なケースの解決策を見つけられませんでした。
この質問をどこから始めればよいかわかりませんが、最善を尽くします。
私の場合、これは機械工場を参照します。
CNCマシンを使用して一連の手順で部品を実行するには、まずマシンでセットアッププロセスを実行する必要があります。この時間は、最後に実行されたパーツのタイプによって異なります。
ウィジェットAでは、マシンにツール1と2を配置する必要があると言います。マシンには以前のツールはなく、各ツールが正しくインストールされるまでには1分かかります。これは、ウィジェットAが2分のセットアップ時間を必要とすることを意味します。さて、ウィジェットBにはツール3と2が必要だとしましょう。この場合、ツール2は再度使用できるため、ツールの変更は2つだけです(ツール1の削除とツール3のインストール)。
次に、部品を実際にそれぞれのマシンで構築するために必要なプロセス時間があります。ほとんどの機械工場では、これはどの機械で稼働しているかによって異なります。
次に、部品が必要とされる日付や特定のジョブへの重み付けなどの制約があります(ジョブが「緊急」としてフラグが付けられている場合、その要件は同様の注文よりも重み付けされます)。
幸い、私の場合、私はこのデータの大部分を持っています。私のシステムは、マシンが特定の部品を組み立てるのにかかる時間と、異なる部品間で必要なセットアップ時間を収集しました。プログラムでこのスケジュールを最適化する方法を検討しているのは、何千もの異なる部品があり、店を熟知しているフルタイムの労働者が日程を計画する必要があるためです。それでも、リードタイムを計算することは悪夢であり、それは結局のところ大まかな見積もりです。
ここの誰かが同様の問題を扱っていて、興味深いと思われるいくつかの研究資料を私に示すことができるかどうか私は興味があります。
これは石畳であることを知っているので、追加情報の問い合わせには喜んで回答します。
あなたが探している知識の集まりは「数学プログラミング」だと思います。
一般に、意思決定をサポートするモデルを構築する必要があります。これを行うには、「おもちゃ」のモデルから始めます。ここで、非常に小さな例を取り上げます。処理するマシンが1つと注文が3つしかないとします。
次に、いくつかの基本的な質問に答える必要があります。
正確には、どのような決定が行われるのですか? 2つの異なるセットがあると思います。
A.ジョブをスケジュールする順序
B.個々のピースにカットを実行する順序
注:Bまたはその時間/コストが固定されていることがわかっている場合、Aを解決するには、ジョブの各組み合わせ間の遷移時間を計算する必要があります。
例(3つのジョブ、a1、a2、a3)
a1-> a2 = 5
a1-> a3 = 10
a2-> a1 = 3
a2-> a3 = 7
a3-> a1 = 2
a3-> a2 = 1
「最短時間」のパスがa3-> a2-> a1 = 1 + 3 = 4であることを確認するために特別な数学は必要ありません
ただし、BがAに依存している場合、AとBの共同ソリューションを決定する際に、Aのすべての可能なスケジュールを組み込んで、時間またはコストを最小化するか、収益を最大化する必要があります。
Bを解く必要がある場合、パーツジオメトリを通る最小コストパスの計算と決定が含まれるため、これは難しい問題です。試してみる価値はないと思います。
Aだけを解く必要がある場合、ここに formulation 学校で行ったものと reference があります。
サイズが大きくなる場合は、設定してソルバーにフィードする必要があります。それ以外の場合、おもちゃの問題では、それは総当たりです。 id Fico Xpress ソルバーにはパッケージ/アセンブリ、またはC#で呼び出すものがあるため、ソルバーをお勧めします。
スケジューリングは困難です。
しかし、部品の特定の順序にかかる時間の計算は簡単です。
私が見つけた最良のアプローチは、最善の推測をし、場合によってはブルートフォースにして、ユーザーが微調整できるようにすることです。セットアップで予想時間を表示します。
これにより、人間の判断が必要なラッシュオーダーのようなシステムと、一般的な作業の提案には「十分な」システムに柔軟性が与えられます。
時間が経つにつれ、ユーザーはアルゴリズムよりも優れている点を指摘するようになり、特定のケースでアルゴリズムを改善できるようになります。