web-dev-qa-db-ja.com

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

架空の理想的なネットワーク使用法をモデル化するためにどのようなデータ構造を使用するかを理解しようとしています。

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

enter image description here

NCTM Graph Creatorを使用して生成された画像

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

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

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

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

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

11
Pops

スペースが問題ではないと仮定すると、単一のグラフではなく、グラフの複数のコピー(ユーザーごとに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を提供し、残りをライブラリから借用します。

必要なものを「属性付きグラフ」と呼びます。属性付きグラフでは、情報(属性)が円弧に付加されます。最も単純な属性付きグラフの1つである重み付きグラフ。

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

1
walrii