選択的に非表示にできるノードとエッジ間に許可された複数のエッジを持つグラフを表現する方法


11

理想的で仮想化されたネットワークの使用をモデル化するためにどのようなデータ構造を使用するかを考えています。

私のシナリオでは、互いに敵対的な多数のユーザーが、潜在的な接続がすべてわかっているコンピューターのネットワークを形成しようとしています。ただし、あるユーザーが接続する必要があるコンピューターは、別のユーザーが接続する必要があるコンピューターとは異なる場合があります。ユーザー1はコンピューターA、B、Dを接続する必要があり、ユーザー2はコンピューターB、C、Eを接続する必要がある場合があります。

ここに画像の説明を入力してください

NCTM Graph Creatorの助けを借りて生成された画像

このコアは、ノードがコンピューターを表し、エッジがイーサネットケーブルを表す、無向の循環グラフになると思います。ただし、シナリオの性質上、隣接リストと隣接行列を除外するいくつかの珍しい機能があります(少なくとも、重要な変更はありません)。

  1. エッジは使用が制限される場合があります。つまり、あるユーザーが特定のネットワーク接続を取得した場合、他のユーザーはその接続を使用できません
    • この例では、緑のユーザーはコンピューターAに接続できない可能性がありますが、赤のユーザーはBをEに接続していますが、それらの間に直接リンクはありません
  2. 場合によっては、ノードの特定のペアが複数のエッジで接続されます
    • この例では、DからEまでの2本の独立したケーブルがあるため、緑と青のユーザーは両方ともこれらのマシンを直接接続できました。ただし、赤はそのような接続を確立できなくなりました
  3. 2台のコンピューターが複数のケーブルで接続されている場合、各ユーザーが所有するケーブルは1本のみです

このグラフでは、次のようないくつかの操作を行う必要があります。

  • 特定のユーザーに対して特定のコンピューターのペアが接続されているかどうかを判断する
  • 特定のユーザーがターゲットコンピューターに接続するための最適なパスを特定する
  • 特定のユーザーの最大遅延コンピューター接続(つまり、分岐のない最長パス)を識別する

最初に考えたのは、単純にすべてのエッジのコレクションを作成することでしたが、検索にはひどいものです。今考えられる最善の方法は、隣接リストを変更して、リスト内の各アイテムにエッジの長さだけでなく、コストと現在の所有者も含まれるようにすることです。これは賢明なアプローチですか?スペースが問題にならない場合、単一のグラフではなく、グラフの複数のコピー(ユーザーごとに1つ)を作成するのが妥当でしょうか?


これは何らかの形で関連しているようです。youtube.com/watch?v=xdiL-ADRTxQ
ラバーダック14

私はそれがここでどのように役立つか本当に見ていません。
ポップ14

だから私はしばらくこれについて考えました。グラフのほとんどのアルゴリズムでは、主に次の2つのことを行う必要があります。近傍を列挙するか、エッジの重みを見つける。リストしたすべての質問には、1人のユーザーのみが関与しています。単一のユーザーの場合、隣接リストまたはエッジの重みを見つけるには、一定の時間(ユーザーカウントが制限されている場合)または「所有権」を持つ隣接リストまたはマトリックスを単純にミラーリングするlog Nで回答できます。そのためには、どちらかを簡単に拡張でき、ユーザー側に気を取られるのではなく、従来の長所に基づいて選択する必要があると思います。
Jトラナ14

回答:


6

スペースが問題にならない場合、単一のグラフではなく、グラフの複数のコピー(ユーザーごとに1つ)を作成するのが妥当でしょうか?

「階層化されたグラフ」とラベル付けできるものを使用する必要があります。つまり、たとえば@、グラフのコンビネータを追加し、

  • AとBがグラフの場合、A @ Bもグラフです(つまり、グラフライブラリのアルゴリズムにフィードできます)。
  • A @ Bの頂点のセットは、AとBの頂点の結合です。
  • A @ Bのエッジのセットは、AとBのエッジの結合です。
  • 構造A @ Bは頂点やエッジを所有していませんが、AとBをデータコンテナーとして使用しています。

このような階層化されたグラフを使用すると、Kをコムンの利用可能な情報として定義し、R、G、Bの各プライベート情報を定義して、各プレイヤーが実際にR @ K、G @ K、B @ Kを見ることができます。

これを実際に実装するには、アルゴリズムを一般的に実装するグラフライブラリを探します。つまり、最長パスアルゴリズムなどは、グラフの実際の表現によってパラメータ化されます。あなたのライブラリが言うなら

ConcreteGraphAlgorithms = GenericAlgorithms(ConcreteGraphImplementation)

簡単に交換できます

LayeredGraphAlgorithms = GenericAlgorithms(LayeredGraphs(ConcreteGraphImplementation))

LayeredGraphsライブラリを提供し、残りをライブラリから借用する場所。


おっと、以前のコメントを無視して、あなたの答えを少し誤解しました。これは基本的に私がやっていることですが、既存のグラフライブラリを利用することはできませんでした。
ポップ14

1

必要なものは「属性グラフ」と呼ばれます。属性付きグラフでは、情報(属性)がアークに添付されます。最も単純な属性グラフの1つである重み付きグラフ。

属性付きグラフを表すには、各セルにさらに情報を追加して列または隣接行列を追加して、隣接リストを使用できます。属性に基づいてアークをフィルタリングすると、非属性グラフのほとんどのアルゴリズムが機能します。属性付きグラフ用に多くのアルゴリズムが開発されているため、ここでは説明しません。


1
確かに、隣接行列は通常、ノードの各ペア間の複数のエッジを表すことはできません
jk。

1
@jk、通常は正しいです。ただし、隣接行列に添付される情報には、アークの数と各アークの個別の属性が含まれる場合があります。しかし、ほとんどの場合、より簡単になるため、隣接リストを使用します。
ワルリー14

1
セルにすべてのエッジの情報をアタッチすると、効果的なアジャセニーリストが得られますが、マトリックスが密なグラフに与える利点を失うことになります
jk。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.