10

入力:グラフG出力:いくつかの独立したセット。すべての独立したセットに対するノードのメンバーシップは一意です。したがって、ノードは、それ自体のセット内のどのノードにも接続できません。パスの例を次に示します。

ここで明確化が求められたので、別の言い換え:

与えられたグラフをセットに分割して、

  1. セット内のメンバーシップによって、ノードを他のすべてのノードと区別できます。たとえば、ノードiがセットAにのみ存在する場合、他のノードはセットAにのみ存在するべきではありません。

    ノードjがセットAとBに存在する場合、他のノードはセットAとBにのみ存在してはなりません。ノードのメンバーシップがビットパターンでコード化されている場合、これらのビットパターンには少なくとも1つのハミング距離があります。

  2. 2つのノードがグラフ内で隣接している場合、それらは同じセットに存在してはならないため、独立したセットになります

例:Bには隣接ノードがありませんD => A、A => D

解決:

  1. AB/
  2. / BD

Aにはビットパターン10があり、そのセットに隣接ノードはありません。Bにはビットパターン11があり、隣接ノードはありません。Dには01があるため、すべてのノードのハミング距離は少なくとも1であり、隣接ノードはありません=>正しい

間違っています。DとAが接続されているためです。

  1. ADB
  2. / DB

Aのセットにはビットパターン10とDがあり、それらは隣接しています。Bにはビットパターン11があり、隣接ノードはありません。DにはBと同様に11があるため、このソリューションには2つのエラーがあるため、受け入れられません。

もちろん、少なくともlog(n)セットが必要なので、グラフ内のノードの数が増えるにつれて、これをより多くのセットに拡張する必要があります。

これにsat-solverを使用するために、私はすでにMAX-SATへの変換を作成しました。しかし、条項の数は非常に多いです。より直接的なアプローチがいいでしょう。これまでのところ近似値がありますが、正確な解または少なくともより良い近似値が必要です。

粒子群を使用して、任意のソリューションからより良いソリューションに向けて最適化するアプローチを試しました。ただし、実行時間はかなりひどく、結果は決して素晴らしいものではありません。動的アルゴリズムか何かを探していますが、この問題を分割統治する方法を理解することはできません。

4

2 に答える 2

7

完全な答えではありません。それがあなたにとってどれほど役立つかわかりません。しかし、ここに行きます:

ハミング距離は私を赤ニシンのように襲います。あなたの問題文は、それが少なくとも1でなければならないと言いますが、1000になる可能性があります。各ノードのセットメンバーシップのビットエンコーディングは一意であると言えば十分です。

問題のステートメントはそれを詳しく説明していませんが、上記の解決策は、すべてのノードが少なくとも 1 つのセットのメンバーである必要があることを示唆しています。すなわち。すべての 0 のビット エンコーディングは、どのノードのセット メンバーシップにも許可されていません。

接続されたノードをしばらく無視すると、バラバラのノードは簡単です。未使用のビット エンコーディングを使用して順番に番号を付けるだけです。それらを最後に保存します。

上記の例では有向エッジを使用していますが、繰り返しになりますが、それは赤いニシンとして私を襲います。A=>D という理由で A が D と同じセットに含まれない場合、D=>A であるかどうかに関係なく、D は A と同じセットに含まれません。

少なくとも log(N) セットが必要であると述べています。また、最大で N 個のセットがあります。全結合グラフ ((N^2-N)/2 個の無向辺を持つ) には、それぞれが単一のノードを含む N セットが必要です。

実際、グラフに M+1 個の頂点と (M^2+M)/2 個の無向辺を持つ M 次元 (M in 1..N-1) の全結合シンプレックスが含まれている場合、少なくとも M+1 が必要になります。セット。

上記の例では、2 つの頂点 {A,D} と 1 つの (無向) エッジ {(A,D)} を持つシンプレックス (M=1) が 1 つあります。

あなたの問題は、グラフ内の最大の完全に接続されたシンプレックスを見つけることに要約されるようです。別の言い方をすれば、ルーティングの問題があります。交差しないようにエッジをルーティングするには、いくつの次元が必要ですか? 非常にスケーラブルな問題のようには思えません。

最初に見つけられる大きなシンプレックスは簡単です。すべての頂点ノードは、独自のビットを持つ新しいセットを取得します。

ばらばらのノードは簡単です。接続されたノードが処理されたら、以前に使用されたビット パターンをスキップして、互いに素なノードに順番に番号を付けます。上記の例から、A と D は 01 と 10 を受け取るため、B で次に使用できるビット パターンは 11 です。

難しい部分は、新しいビットで新しいセットを作成する前に、残りのシンプレックスを可能な限り既存の範囲に折り畳む方法です。フォールディングでは、各ノードに 2 つ以上のビット (セット) を使用する必要があり、ビット (セット) は隣接するノードのビット (セット) と交差してはなりません。

上記の例に別のノード C を追加するとどうなるかを考えてみましょう。

C が A と D の両方に直接接続する場合、最初の問題は、3 つの頂点 {A,C,D} と 3 つのエッジ {(A,c),(A,D),(C,D) を持つ 2-シンプレックスを見つけることになります。 )}。A、C、および D がビット パターン 001、010、および 100 を取得すると、互いに素な B で使用可能な最小のビット パターンは 011 になります。

一方、C が A または D を直接接続し、両方を接続しない場合、グラフには 2 つの 1-シンプレックスがあります。最初にビット パターン 01 と 10 を与える頂点 {A,D} を持つ 1-シンプレックスを見つけたと仮定すると、問題は C をその範囲に折り畳む方法になります。少なくとも 2 ビットのビット パターンは 11 だけですが、これは C が接続するノードと交差するため、新しいセットを作成して C を入れる必要があります。この時点で、ソリューションは上記のものと似ています。

C が互いに素である場合、B または C のいずれかがビット パターン 11 を取得し、残りの 1 つは新しいセットを必要とし、ビット パターン 100 を取得します。

C が B に接続されているが、A または D には接続されていないとします。この場合も、グラフには 2 つの 1-シンプレックスがありますが、今回はバラバラです。上記のように {A,D} が最初に検出され、A と D にビット パターン 10 と 01 が与えられたとします。B または C を既存の範囲に折りたたむことができます。範囲内で使用可能な唯一のビット パターンは 11 であり、どちらも A または D に隣接していないため、B または C のいずれかがそのパターンを取得できます。11 が使用されると、2 つ以上のビットが設定されたビット パターンは残りません。残りのノードにビット パターン 100 を与える新しいセット。

C が 3 つの A、B、D のすべてに接続しているとします。この場合、グラフには 3 つの頂点 {A,C,D} を持つ 2-シンプレックスと 2 つの頂点 {B, C} を持つ 1-シンプレックスがあります。上記のように処理を進めると、最大のシンプレックスを処理した後、A、C、および D のビット パターンは 001、010、100 になります。 111. 101 を除くこれらすべてが C と交差するため、B はビット パターン 101 を取得します。

問題は次のようになります:最大の全結合シンプレックスをどれだけ効率的に見つけることができるでしょうか?

最大の全結合シンプレックスを見つけるのにコストがかかりすぎる場合は、接続に関して最大​​最小値を見つけることにより、潜在的な全結合シンプレックスに近似の上限を設定できます。

  1. エッジをスイープし、接続エッジの数で頂点を更新します。

  2. 接続されたノードごとに、最初はゼロの Cn カウントの配列を作成します。ここで、Cn はノード n に接続されたエッジのカウントです。

  3. 接続されたノード n1 と n2 のエッジを再度スイープし、Cn2 に対応する n1 のカウントをインクリメントします。逆も同様です。Cn2 > Cn1 の場合、n1 配列の最後のカウントを更新し、その逆も同様です。

  4. 接続されたノードを再度スイープし、各ノードが属する最大のシンプレックスの上限を計算します。ノードをスイープするときに、各上限の頂点のリストを使用して鳩の穴配列を作成できます。

  5. ピジョン ホール アレイを最大から最小まで処理して、ノードを抽出し、一意のセットに折りたたみます。

ノードがセット N にあり、エッジがセット E にある場合、複雑さは O(|N|+|E|+O(Step 5)) になります。

上記の概算で十分な場合、問題は次のようになります:要件が与えられた場合、どの程度効率的にノードを既存の範囲に折りたたむことができますか?

于 2010-08-30T04:59:52.180 に答える
1

これはあなたが期待する答えではないかもしれませんが、コメントを追加する場所が見つかりません. だからここに直接入力します。あなたの質問を完全には理解できません。それとも理解するのに特別な知識が必要ですか?この独立集合は何ですか?私が知っているように、有向グラフからの独立セット内のノードには、このセット内の他のノードへの双方向パスがあります。あなたの考えは同じですか?

この問題が私が想定しているようなものである場合、独立集合はこのアルゴリズムで見つけることができます: 1. 有向グラフで深さ優先検索を行い、このノードをルートとするツリーがトラバースされた時間を記録します。2. 次に、このグラフのすべてのエッジを逆にします。アルゴリズムは本「アルゴリズム入門」で的確に解説されています

于 2010-08-27T10:12:59.597 に答える