この問題を考えてみましょう:有限集合のリストが与えられたら、最小化する順序を見つけます。
このための既知のアルゴリズムはありますか?その複雑さは何ですか?私はまだ効率的な最適なアルゴリズムを考えることができませんでしたが、NP-Hardでも明らかにそうではありません。
この問題を考えてみましょう:有限集合のリストが与えられたら、最小化する順序を見つけます。
このための既知のアルゴリズムはありますか?その複雑さは何ですか?私はまだ効率的な最適なアルゴリズムを考えることができませんでしたが、NP-Hardでも明らかにそうではありません。
回答:
この問題は、実際には、「重み付き完了時間を最小化するための優先順位制約付きスケジューリング」として知られているスケジューリング問題に関連しています。問題は次のとおりです。各ジョブに処理時間(p)と重み(w)があり、優先度グラフがジョブに定義されているジョブのセットを考えます。目標は、優先順位の制約が定められ、加重完了時間の合計が最小化されるように、単一のマシン(プリエンプティブではない)でジョブをスケジュールすることです。問題はNP困難であり、2-近似が知られています。
最小累積和問題から優先順位制約付きスケジューリング問題への削減:各要素に対して、p = 1、w = 0のジョブを作成します。また、各セットに対して、p = 0、w = 1のジョブを作成します。要素の場合は、そしてeは前にスケジュールする必要がありますS。スケジューリング問題のこの特殊なケースもNP困難だと思います。
次のリンクを参照してください。
Shalmoli Guptaは、一般的な問題はNP-Hardであると既に説明したので、特殊なケースが多項式で解けるかどうかを調査することにしました。最終的に、ツリーを表すセットの特別なケース、より一般的には、すべての比較できないセットが互いに素であるサブセットの包含による直列並列順序の解決策を見つけました。
物事を簡単にする1つのプロパティは、セットのリストが交差点の下で閉じられている場合です。もし、そして、その中で最適な順序があるね1が前に来てね2。WLOGでは、最適な順序付けは、サブセットの包含によって与えられる部分順序の線形拡張であると想定できます。
セットのすべてのサブセットは順序の前に表示されるため、指定されたセットによって現在の合計に追加される金額は、表示される場所に関係なく固定されます。がセットのリストである場合、セットの増分コストは、Sに現れるsのサブセットにないsの要素の数です。同じセットがSに複数回出現する場合、最初に行くものを任意に選択し、他のセットのコストを0にすることができます。
つまり、この問題は、優先順位制約のある単一マシンのスケジューリングでの最小完了時間の問題と同等です。この問題では、重みと時間t jのジョブのセット、およびジョブPの半順序が与えられた場合、加重合計完了時間を最小化するジョブの順序、つまり
優先順位制約従います。交差点閉集合の最小累積集合問題は、各集合のジョブを作成することでこれに変えることができます。すべてのジョブには重み1があり、時間は上記で定義された増分コストに等しく、Pはサブセットの包含によって与えられる順序です。
結局のところ、この問題は一般的なとってもNPハードです。ただし、Pの特定の特殊な形式は、多項式時間で解くことができます。
この論文では、直列並列順序Pの場合(ツリーの重要な場合も含まれます)のアルゴリズムを示します。残念ながら、私はその論文にアクセスできなかったので、独立して再発明しようとすることにしました。ここに私が思いついたものがあります。
この問題を解決するには、いくつかの観察が必要です。
まず、優先順位の制約がない場合の最適な解決策は、t jの増加順にジョブを単純にソートすることです。。簡単にするために、これをジョブの値、v(j)と略します。ソートはO(nlogn)であるため、この複雑さよりも優れた処理を行うことは不可能であることに注意してください。
ルール1ましょうと(b)は、このようなことの仕事も< B ∈ PとBのカバー。場合は、V ()< V (B )、そして我々は、制約ドロップすることができ、A < Bを最適な順序や目標値に影響を与えず。
仮定前に表示されますリラックスした問題の最適な順序インチ bは元々aをカバーしていたため、新しい順序でbとaの間のすべてのジョブがaとbに匹敵することを意味します。しかし、bはaよりも高い値を持っているため、矛盾するbとaを入れ替えることで客観的な値を減らすことができます。
同様に、場合は、値でソートした後、元の(簡略化された)問題の優先関係を参照することで確実に関係を壊す限り、制約を削除できます。これにより、緩和された問題に対して見つかった最適なソリューションが、元の問題に対する最適なソリューションでもあることが保証されます。
bはカバーし、いつでもそのため、、我々は制約ドロップすることで、問題を単純化することができ、A < Bを。
ルール2最適なソリューションでは、aの直後にbが続くことがわかっているとします。ポーズPを適切に縮小しながら、aとbをとt c = t a + t bで新しいノードcにマージできます。
新しい問題の最適な目標値は、元の目標値(具体的には)とは定数によって異なりますが、この定数は順序に依存しないため、最適な順序は影響を受けません。新しい問題の最適な解決策を取り、cをa bに置き換えることにより、古い問題の最適な解決策を回復できます。
ルール3問題インスタンスへの最適解で、と仮定直前に来てBとV ()> V (B )。今度は、元のシリーズまたは並列構成から形成された新しいポーズで新しいジョブを追加して、より大きな問題インスタンスを作成するとします。常に大きな問題に最適な解決策があるでしょう直前に来て、B。
そうでないと仮定します。最適解にます。Pは直列並列合成によって形成されたため、すべてのx iがaおよびbと比較できないことを知っています。すべてのマージのx 私の新しいノードにノードX "今考えるルール2を用いて、V (Xを")。もしV (X ")≤ V ()、我々は入れ替えることができますおよび aは、客観的な値を増加させません。同様に、場合 V (X ")≥ V (B )、我々は交換することができ、X "および Bを。したがって、 v (a )< v (x ′)< v (b )。しかし、 v (a )> v (b )、矛盾。
ルール2とルール3を使用すると、すでにシンプルだが準最適なアルゴリズムを取得できます。以来、Pは、直列並列順序で、入力のツリー表現含まれているとPの各ノードは、直列構成または並列組成を示し、葉が個々のジョブです。各副問題に対する最適な解が値の昇順の連鎖であるという不変式を維持することにより、ツリーの事前順序走査による最適な解を見つけることができます。
仮定 posetsと部分問題の一連の組成物であり、P 1及びP 2。最適な解がC 1とC 2を順序付けているとします。Pの最適なソリューションは、明らかにこれらのチェーンの連結です。ただし、C 2の最初のジョブの値がC 1の最後のジョブよりも低い可能性があります。ソリューションがソートされたチェーンであるという不変条件を維持するために、ルール3 +ルール2を使用して、エンドポイントがソートされていない限り、エンドポイントをマージします。
が代わりに並列構成である場合、ソートされたチェーンS 1およびS 2を取得し、それらを新しいソートされたチェーンにマージします。不変式のおかげで、これは有効です。
残念ながら、このアルゴリズムはです。O (n l o g n )アルゴリズムを取得するには、ルール1を使用してチェーンを遅延計算する必要があります。
特に、サブ問題に優先順位の制約が値の順序と同じノードのみが含まれる場合、優先順位の制約を完全に忘れて、値だけを見ることができます。これは、ソリューションが以前のアルゴリズムでソートされたチェーンであることを保証したのと同じ不変条件によって保証されます。
各サブ問題のソートされたチェーンを計算する代わりに、サブ問題のすべてのジョブを含むフィボナッチヒープのペア、最小ヒープと最大ヒープとしてサブ問題の最適なソリューションを表します。これは、対数時間で解の最小または最大要素をポップできることを意味します。
前と同様に、事前注文のトラバーサルを行います。ここで、直列組成物である、まずヒープ対と第2ヒープ対の最小ジョブの最大ジョブを調べます。値が順不同の場合は、ルール2と3を使用して値をポップし、マージします。次に、新しく作成されたジョブを新しいエンドポイントと比較し、順不同である限りポップとマージを続けます。エンドポイントに順不同の値がなくなると、ルール1のおかげでシリーズの優先順位の制限を安全に忘れることができます。次に、新しく作成されたジョブがある場合はヒープにプッシュし、ヒープをマージしてソリューションを表すヒープペアを作成しますPそのもの。
並列構成の場合、ヒープペアを単純にマージします。新しい最小ヒープは、各サブ問題の最小ヒープと最大ヒープのマージです。フィボナッチヒープは一定の時間でマージできることに注意してください。
問題全体の解決策を表すヒープペアを作成したら、最小ヒープが空になるまでポップすることで、実際の解決策の順序を見つけることができます。その後、すべてのルール2の置換を取り消して、元の問題の解決策を取得します。
ヒープからポップされる各ジョブは、すぐに新しいジョブにマージされて合計ジョブ数が削減されるか、最後に一度だけポップされます。したがって、最大で線形の数のヒープポップがあり、全体で時間になります。他の操作は、ノードまたはジョブごとに一定の時間であるため、全体にわたって線形です。