私はプログラマーであり、NP完全な問題があり、それを解決する必要があると仮定します。NPCの問題に対処するための方法は何ですか?このトピックに関する調査などがありますか?
私はプログラマーであり、NP完全な問題があり、それを解決する必要があると仮定します。NPCの問題に対処するための方法は何ですか?このトピックに関する調査などがありますか?
回答:
よく研究された戦略がいくつかあります。アプリケーションに最適なのは状況に依存します。
最悪の場合の実行時間の改善
問題固有の洞察を使用すると、多くの場合、素朴なアルゴリズムを改善できます。たとえば、[1]の頂点カバーにはアルゴリズムがあります。これは、素朴なよりも大幅に改善されており、インスタンスサイズが適切なものになる可能性があります。
予想される実行時間の改善
ヒューリスティックを使用すると、多くのインスタンスで高速なアルゴリズムを頻繁に考案できます。それらが実際に出会うもののほとんどを含む場合、あなたは黄金です。例としては、非常に複雑なソルバーが存在するSATや、シンプレックスアルゴリズム(多項式問題を解決しますが、それでも)があります。しばしば役立つ基本的なテクニックの1つは、ブランチアンドバウンドです。
問題を制限
する入力についてより多くの仮定を立てることができる場合、問題は簡単になる可能性があります。
結果を
弱めるこれは、エラーまたは不完全な結果を許容することを意味します。2つの主なフレーバーがあります。
徹底的な処理については、Hromkovičによる困難な問題のアルゴリズムを参照してください。
他の回答では、より理論的な観点からこれに対処しています。より実用的なアプローチを次に示します。
「典型的な」NP完全決定問題(「これらの制約をすべて満たすものが存在するか?」)の場合、これは私が常に最初に試みることです:
次に、優れたSATソルバーを使用して実行し(たまたま最速のマルチコアコンピューターを使用して)、何が起こるかを確認します。
最初に小さいインスタンスで試して、どれくらい時間がかかるかを理解してください。
驚くべきことに、このアプローチは、現在の問題に特化した独自のソルバーを実装するよりもはるかに優れています。
SATソルバーは非常に賢く、最適化されています。バックトラッキング検索の独自の実装よりも、コードの最適化にどれだけ時間が無駄になっても簡単に実行できます。また、整数線形計画法ソルバーなど、多くの市販の代替品よりも簡単に優れています。
これには、プログラミングはほとんど必要ありません。ステップ1は比較的簡単で、パフォーマンスは重要ではありません。Pythonなどのスクリプト言語を使用できます。他の誰かが、ステップ2に必要なすべての実装をすでに行っています。
典型的なNPハード最適化問題(「これらの制約をすべて満たす最小のものを見つける」)の場合、このアプローチは機能する場合としない場合があります。
それを簡単に決定問題に変えることができるなら(「これらの制約をすべて満たすサイズ4のものがありますか?」、「サイズ3はどうですか?」)、素晴らしい、決定問題で上記と同じアプローチに従ってください。
そうでない場合は、小さなソリューション(必ずしも最小のソリューションである必要はありません)を見つけようとするヒューリスティックソルバーに頼ることができます。例えば:
問題を(重み付き)MAX-SATインスタンスとしてエンコードします。
UBCSATパッケージのヒューリスティックソルバーを使用します。ヒューリスティックソルバーは簡単に並列化します。数百台のコンピューターがあるコンピュータークラスターを見つけようとします。必要なだけソルバーを実行して、これまでに見つけた最適なソリューションを使用できます。
難治性を攻撃する1つの方法は、パラメーター化された複雑さのコンテキストで問題を考えることです。
これらは、W階層のさまざまなクラスのサンプルです。
これらは、NP問題をより正確な方法で分類するための別のレベルの複雑さであり、さらに必要な場合は、パラメーター化された回路の複雑さおよび Downey et al(1998)によるW階層を参照できます。
また、さらに必要な場合は、Flum and GroheのParameterized Complexity Theoryを読んでください。
そして最後に:
問題にFPTAS(完全な多項式時間近似スキーム)がある場合、FPT(明らか)であることが知られていますが、逆方向にはよく知られているものはなく、PTASとXPの関係に関するいくつかの作業もありますが、 PTASとW階層との密接な関係ではありません(少なくとも現時点ではわかりません)。
また、いくつかの異なるパラメータを修正する場合もあります。たとえば、グラフ内の最長パスの長さは制限され、ソリューションのサイズは制限されます(たとえば、フィードバック頂点セット)。
一部の人々は、パラメータ化された複雑さは実際には役に立たないと信じているかもしれません。しかし、これは間違っています。パラメーター化されたアルゴリズムの多くは、いくつかのパラメーターを修正できる実際のアプリケーションで発見されています。以下に例を示します。
TSPの最速かつ最も正確なヒューリスティックアルゴリズムの1つは次のとおりです。問題のパラメーター化を使用するツアーマージと分岐分解(直接ではなく、分岐分解と使用する動的プログラミングアプローチはいくつかの適切な仮定に基づいています)。
いくつかの回答で簡単に触れましたが、実際には、NP完全問題は常に解決(または近似)されていることを強調させてください。NP完全問題を実際に解決できる主な理由は次のとおりです。
実際に遭遇するインスタンスは「最悪のケース」ではありません。
不一致のもう1つの理由は次のとおりです。
ヒューリスティックアルゴリズムを正式に分析することは困難です。
実際には、ヒューリスティックアルゴリズムを使用してNP完全問題を解決し、最善の結果を期待します。結果はしばしば驚くべきものです。
他の回答で触れられた別の問題は次のとおりです。
指数アルゴリズムが十分に速い場合があります。
それはもちろん問題に依存します。ビッグデータが関係する場合、反対の格言があります。
実行可能な唯一のアルゴリズムが準線形である場合もあります。
ここの群衆はむしろ理論的に傾いているのではないかと思う。メインのstackexchangeサイトでより良い答えを得るかもしれません。