最適な順序を見つける


9

私はこの問題に遭遇し、それに取り組む方法を見つけるのに苦労しています。どんな考えでも大歓迎です!

たとえば、行列 -1、0、1が与えられているとします。{1,0,1}n × k

[1010110001011011101110001]

すべての順列を試行せずに、最初の非ゼロ要素が1である行の数を最大にする列順序を見つけます。c1

上記の例では、そのような順序付け(一意ではありません!)は(c3,c4,c1,c2,c5。つまり、

[1010100101100110111100101]

ここでは、5行のうち4行の場合、最初の非ゼロ要素は1です。51


どのアルゴリズムアプローチを試しましたか?この問題はどこで発生しましたか?元のソースを信用できますか?コンテキストや動機について何か共有できますか?あなたは見つけるかもしれないこのページはあなたの質問を改善するのに役立ちます。
DW

1
前処理ステップを提案したいと思います。セミポジティブ列(または行)を0と1のみの列(各行)とします。提案は、すべての準正列、および準正列の1を持つ行も削除することです。あなたの例では、行1、3、および4が削除されます。これで、すべて-1を含む行と列が残ります。役に立たないかもしれませんが、それを推論する方が簡単かもしれません。
PAL GD

行数が列数よりはるかに少ないと想定できますか?これは問題を簡単にするかもしれません。
アンジェラプレトリウス

1
@Pål、1を含まない行と列でも同様の前処理が可能です。しかし、それが理由を簡単に説明できるとは思いません。
Peter Taylor

1
FWIWこれはクロスポストです。ハイジョー、あるスタックで回答が得られず、別のスタックの方が良いと思う場合は、フラグを立てて移行をリクエストできます。他のサイトで受け取った回答に回答者が気づかず、回答を繰り返すのに時間を浪費する可能性があるため、クロス投稿はエチケットとしては適切ではありません。
Peter Taylor

回答:


4

私が列の順序付けのためにCOと呼ぶこの問題はNP困難です。これは、NP困難な問題であるVertex Cover(VC)からそれに還元されます。

VCおよびCOの決定問題形式

入力VCインスタンスをます。これは、質問を表す:「グラフが与えられると、それはせいぜいのセットを選択することが可能であるの頂点内のすべてのエッジように少なくとも一つの選択された頂点に入射します?」次の質問を表すCOのインスタンスを作成します。「行列に -1、0、1要素を指定すると、の列をように並べ替えることができます。少なくとも行で-1の前に表示されますか?」これら2つの問題は、意思決定問題で述べられています。(V,E,k)(V,E)kVE(A,k)A{1,0,1}K 'Akそれぞれの答えが「はい」または「いいえ」のどちらかである形式。形式的に言えば、NP完全な(またはそうでない)問題はこの形式です。OPの質問で述べられているより自然な最適化問題の形式が複雑さの点でほぼ同等であることを確認することはそれほど難しくありません。最適化問題ソルバーを呼び出し、その後に単一の比較を行うだけで、決定問題を解決できます。

VCのインスタンスからCOのインスタンスを構築する

ましょう および。行列の行列を作成します。上の行は、それぞれ行の個のブロックで構成され、各ブロックは、カバーする必要があるエッジを表します。下の行には頂点「フラグ」が含まれており、COソリューションの左側(頂点に含まれている頂点に対応)に含まれている場合、列(頂点に対応)に固定コストが発生します。 VCソリューションのカバー)。n=|V|m=|E|A(n+1)m+nn+1(n+1)mmn+1nn

頂点ごとに、次のような列を作成します。vi

  • 上位行の中で、エッジがに入射する場合、行の番目のブロックはすべて+1を含み、それ以外の場合は0を含みます。(n+1)mjn+1ejvi
  • -1である番目を除いて、下の行はすべて0 です。ni

の-1のコピーと、それに続くの+1のコピーで構成される「フェンス」列をもう1つ作成します。(n+1)mn

最後に、構築されたCOインスタンスのしきい値を設定します:。言い換えると、+ 1の前に-1が現れる最大行を許可します。この違反行の数をCOソリューションの「コスト」と呼びましょう。k(n+1)m+nkk

証明

COインスタンスの解と元のVCインスタンスの頂点のセットとの間の対応は、次のとおりです。フェンスの左側のすべての列は、セット内の頂点に対応し、フェンスの右側のすべての列は、ない頂点。

直感的に、「フェンス」列の最上部の-1は、これらのすべての位置に+1が含まれる列のサブセットの選択を左に配置することを強制します-すべてに発生する頂点のサブセットに対応します縁。 「フェンス」の左側に表示されるこれらの各列は、下の行のどこかにある個別の行に-1があり、コストは1になります。「フェンス」の下部にある+1は、右側に配置されたすべての列にそのようなコストがかからないようにします。n

明らかに最大で用いVC溶液頂点は高々コストで構築COインスタンスに対する解が得られる:ちょうど順序を任意の順序で残りのすべての列が続くフェンスカラム、続いて任意に頂点カバーの頂点に対応する列、 。kk

コストが最大で COインスタンスのソリューションは、最大で頂点を持つ頂点カバーに対応することを示す必要があります。kk

反対に、コストが最大で COインスタンスに対するソリューションが存在し、先頭の行の一部の行に+1の前に-1 が残ると仮定します。この行は、特定のエッジ対応する行のブロックに属しています。元のインスタンスこのブロックのすべての行は、構造上同一です。列を入れ替えると、これらの行が変更される可能性がありますが、それらが同一であるという事実には影響しません。したがって、これらの個の同一の行のそれぞれは、ソリューションで+1の前に-1を持ち、少なくともコストを意味します。しかし、:矛盾。k(n+1)m(n+1)uvAn+1n+1kn<n+1

上の行のブロックの各行には-1の前に+1があるため、対応する各エッジは、フェンスの左側の列に対応する頂点で覆われています。 、この頂点のサブセットは、頂点カバーを構成します。上の行には+1の前に-1がないため、ソリューションでコストが発生する唯一の場所は、フェンスの左側に配置された列から下の行です。そのような各列のコストは正確に1であるため、コストが最大でであるとすると、そのような列は最大ででなければならず、したがってカバーには最大で頂点が必要です。m(n+1)m(n+1)mnkkk

最後に、COインスタンスはVCインスタンスから多項式時間で構築できることは明らかです。つまり、COを解くための多項式時間アルゴリズムが存在する場合、説明したように最初にCOインスタンスを構築することにより、任意のVCインスタンスを多項式時間で解くこともできます。上記とそれを解決します。VCはNPハードであるため、COもハードです。


このような素晴らしい答えがあるときはいつでも、「ホットなネットワークの質問」を「価値のあるネットワークの答え」のようなものに置き換えるか、結合する必要があるのか​​と思います。
John L.

どのようにして答えを見つけるかについて少し説明していただけますか?それは答え自体よりもさらに啓発的であるべきです。
John L.

1
@ Apass.Jack:ありがとう!:)私は特別な戦略を持っておらず、間違った方向にさまよう長い時間を費やすことができます。たとえば、ここでは長い時間を費やして、ハミルトニアンサイクル(要素の順序に関する限り同様)から削減できると考えてから、構造がサブツアーに対応する構成を許可し、機能しないことに気づきました。原則として、私は常にバーテックスカバーまたはパーティションから削減を試みます。「貴重なネットワークの答え」は素晴らしいアイデアのように聞こえます:)
j_random_hacker

1
@ Apass.Jack:有用な一般的なアイデアの1つは、回答を変更せずにターゲット問題のインスタンスを「スケーリング」する方法を考えることです。整数はグラフの互いに素なコピーであり、しきい値krを掛けても答えは変わりません。多くの場合、特定の違反(有効なソースソリューションに対応しないターゲットソリューション)に特定の違反を "圧倒"させたい場合があり、その場合、より重要な違反に対応するガジェットを "乗算"できます。rkr
j_random_hacker

1
私の答えを減らすために、2つの「力」がある問題のインスタンスをエンコードしたいと思います。すべてのエッジをカバーするようにして、できるだけ少ない頂点を使用するようにしてください。ここでは最初の方がより重要なので、エッジに対応する行を「乗算」します。単一のエッジ違反は要します。つまり、すべての頂点を含めるよりも、単一のエッジを見逃すほうが悪いことになります。そして今、私はこれらの2つの問題の決定問題バージョンを処理していることを明示するために回答を編集する必要があることに気づきました。しきい値パラメーターは問題インスタンスの一部です...n+1
j_random_hacker '28

2

実際に多項式の解があるかどうかはわかりません。それにもかかわらず、PålGDのコメントに基づいて、簡略化関数を構築できます。出力シーケンスSを作成すると、初期行列は単純化されます。

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がコメントで説明したように)与える

  • S[0]=c3、r1、r3を削除
  • S[1]=c4、r4を削除
  • S[2]=c2 これにより、探索する簡単な行列が得られます。
    [1111]

この方法を非効率的にする行列は、[ 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 ]

[110000110000001100001100000011000011]

それにもかかわらず、簡略化はまだ探索ステップの約半分を節約します。また、このタイプのマトリックスは、いくつかの独立したサブマトリックスに分割できます。


1
@ Apass.Jackより正確に編集しました。はい、出力シーケンスの列位置を意味しました。
Optidad

簡略化のステップは実用的な目的(オンラインプログラミングの演習など)には十分かもしれないので、賛成です。
John L.

おかげで、実際には償却時間のコストを見積もることに興味がありましたが、方法がよくわかりません。これは可能ですか?それとも、多くの問題に依存していますか?
Optidad

2
ijijjij

1
ijijijijikk
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.