私はこの問題に遭遇し、それに取り組む方法を見つけるのに苦労しています。どんな考えでも大歓迎です!
たとえば、行列 -1、0、1が与えられているとします。
すべての順列を試行せずに、最初の非ゼロ要素が1である行の数を最大にする列順序を見つけます。
上記の例では、そのような順序付け(一意ではありません!)は。つまり、
ここでは、5行のうち行の場合、最初の非ゼロ要素は1です。
私はこの問題に遭遇し、それに取り組む方法を見つけるのに苦労しています。どんな考えでも大歓迎です!
たとえば、行列 -1、0、1が与えられているとします。
すべての順列を試行せずに、最初の非ゼロ要素が1である行の数を最大にする列順序を見つけます。
上記の例では、そのような順序付け(一意ではありません!)は。つまり、
ここでは、5行のうち行の場合、最初の非ゼロ要素は1です。
回答:
私が列の順序付けのためにCOと呼ぶこの問題はNP困難です。これは、NP困難な問題であるVertex Cover(VC)からそれに還元されます。
入力VCインスタンスをます。これは、質問を表す:「グラフが与えられると、それはせいぜいのセットを選択することが可能であるの頂点内のすべてのエッジように少なくとも一つの選択された頂点に入射します?」次の質問を表すCOのインスタンスを作成します。「行列に -1、0、1要素を指定すると、の列をように並べ替えることができます。少なくとも行で-1の前に表示されますか?」これら2つの問題は、意思決定問題で述べられています。K 'それぞれの答えが「はい」または「いいえ」のどちらかである形式。形式的に言えば、NP完全な(またはそうでない)問題はこの形式です。OPの質問で述べられているより自然な最適化問題の形式が複雑さの点でほぼ同等であることを確認することはそれほど難しくありません。最適化問題ソルバーを呼び出し、その後に単一の比較を行うだけで、決定問題を解決できます。
ましょう および。行列の行列を作成します。上の行は、それぞれ行の個のブロックで構成され、各ブロックは、カバーする必要があるエッジを表します。下の行には頂点「フラグ」が含まれており、COソリューションの左側(頂点に含まれている頂点に対応)に含まれている場合、列(頂点に対応)に固定コストが発生します。 VCソリューションのカバー)。n
頂点ごとに、次のような列を作成します。
の-1のコピーと、それに続くの+1のコピーで構成される「フェンス」列をもう1つ作成します。
最後に、構築されたCOインスタンスのしきい値を設定します:。言い換えると、+ 1の前に-1が現れる最大行を許可します。この違反行の数をCOソリューションの「コスト」と呼びましょう。
COインスタンスの解と元のVCインスタンスの頂点のセットとの間の対応は、次のとおりです。フェンスの左側のすべての列は、セット内の頂点に対応し、フェンスの右側のすべての列は、ない頂点。
直感的に、「フェンス」列の最上部の-1は、これらのすべての位置に+1が含まれる列のサブセットの選択を左に配置することを強制します-すべてに発生する頂点のサブセットに対応します縁。 「フェンス」の左側に表示されるこれらの各列は、下の行のどこかにある個別の行に-1があり、コストは1になります。「フェンス」の下部にある+1は、右側に配置されたすべての列にそのようなコストがかからないようにします。
明らかに最大で用いVC溶液頂点は高々コストで構築COインスタンスに対する解が得られる:ちょうど順序を任意の順序で残りのすべての列が続くフェンスカラム、続いて任意に頂点カバーの頂点に対応する列、 。
コストが最大で COインスタンスのソリューションは、最大で頂点を持つ頂点カバーに対応することを示す必要があります。
反対に、コストが最大で COインスタンスに対するソリューションが存在し、先頭の行の一部の行に+1の前に-1 が残ると仮定します。この行は、特定のエッジ対応する行のブロックに属しています。元のインスタンスこのブロックのすべての行は、構造上同一です。列を入れ替えると、これらの行が変更される可能性がありますが、それらが同一であるという事実には影響しません。したがって、これらの個の同一の行のそれぞれは、ソリューションで+1の前に-1を持ち、少なくともコストを意味します。しかし、:矛盾。
上の行のブロックの各行には-1の前に+1があるため、対応する各エッジは、フェンスの左側の列に対応する頂点で覆われています。 、この頂点のサブセットは、頂点カバーを構成します。上の行には+1の前に-1がないため、ソリューションでコストが発生する唯一の場所は、フェンスの左側に配置された列から下の行です。そのような各列のコストは正確に1であるため、コストが最大でであるとすると、そのような列は最大ででなければならず、したがってカバーには最大で頂点が必要です。
最後に、COインスタンスはVCインスタンスから多項式時間で構築できることは明らかです。つまり、COを解くための多項式時間アルゴリズムが存在する場合、説明したように最初にCOインスタンスを構築することにより、任意のVCインスタンスを多項式時間で解くこともできます。上記とそれを解決します。VCはNPハードであるため、COもハードです。
実際に多項式の解があるかどうかはわかりません。それにもかかわらず、PålGDのコメントに基づいて、簡略化関数を構築できます。出力シーケンスを作成すると、初期行列は単純化されます。
function simplification:
while(true)
if any row i$ has no 1 or no -1 left, remove it
if any column j has no -1 then,
remove it and put j on the leftmost available position in S,
remove all rows where column j has 1.
if any column j has no 1 then,
remove it and put j on the rightmost available position in S.
if no modification has been done on this loop, break
次に、関数pickを繰り返し使用して、組み合わせの完全な調査を行う必要があります。
function pick(k):
put column k on the leftmost available position in S
remove any row where column k is -1 or 1
すべての選択の後、探索する可能性の数を減らすために単純化を行うことができます。-1が少ない列から貪欲に探索することをお勧めします。したがって、停止基準を設定して下限に達する可能性があります。
与えられた例では、最初の単純化は(PålGDがコメントで説明したように)与える
この方法を非効率的にする行列は、[ − 1 1 0 0 0 0 1 − 1 0 0 0 0 0 0 − 1 1 0 0 0 0のように、行/列ごとに1と1
1 − 1 0 0 0 0 0 0 − 1 1 0 0 0 0 1 − 1 ]
それにもかかわらず、簡略化はまだ探索ステップの約半分を節約します。また、このタイプのマトリックスは、いくつかの独立したサブマトリックスに分割できます。