架空の理想的なネットワーク使用法をモデル化するためにどのようなデータ構造を使用するかを理解しようとしています。
私のシナリオでは、互いに敵意を持っている多くのユーザーが、すべての潜在的な接続がわかっているコンピューターのネットワークを形成しようとしています。ただし、あるユーザーが接続する必要があるコンピューターは、別のユーザーが接続する必要があるコンピューターと同じではない場合があります。ユーザー1はコンピューターA、B、Dを接続する必要があるかもしれませんが、ユーザー2はコンピューターB、C、Eを接続する必要があるかもしれません。
NCTM Graph Creatorを使用して生成された画像
この中核は、ノードがコンピューターを表し、エッジがイーサネットケーブルを表す無向循環グラフになると思います。ただし、シナリオの性質上、隣接リストと隣接マトリックスを除外する珍しい機能がいくつかあります(少なくとも、重要な変更はありません)。
このグラフに対して、次のようないくつかの操作を行う必要があります。
私が最初に考えたのは、単純にすべてのエッジのコレクションを作成することでしたが、それを検索するのは大変です。私が今考えられる最良のことは、隣接リストを変更して、リストの各項目にエッジの長さだけでなく、コストと現在の所有者も含まれるようにすることです。これは賢明なアプローチですか?スペースが問題ではないと仮定すると、単一のグラフではなく、グラフの複数のコピー(ユーザーごとに1つ)を作成するのが妥当でしょうか。
スペースが問題ではないと仮定すると、単一のグラフではなく、グラフの複数のコピー(ユーザーごとに1つ)を作成するのが妥当でしょうか。
「階層化されたグラフ」とラベル付けできるものを使用する必要があるようです。つまり、グラフのコンビネータを追加して、たとえば@
とすると、次のようになります。
このような階層化されたグラフを使用すると、Kを一般的な利用可能な情報として定義し、R、G、Bの各プライベート情報を使用して、各プレーヤーが実際にR @ K、G @ K、B @ Kを見ることができます。
これを実際に実装するには、アルゴリズムを実装しているグラフライブラリを探します。つまり、最長パスアルゴリズムなどがグラフの実際の表現によってパラメータ化されるようにします。あなたの図書館が言うなら
ConcreteGraphAlgorithms = GenericAlgorithms(ConcreteGraphImplementation)
あなたは簡単にそれを置き換えることができます
LayeredGraphAlgorithms = GenericAlgorithms(LayeredGraphs(ConcreteGraphImplementation))
LayeredGraphs
を提供し、残りをライブラリから借用します。
必要なものを「属性付きグラフ」と呼びます。属性付きグラフでは、情報(属性)が円弧に付加されます。最も単純な属性付きグラフの1つである重み付きグラフ。
属性付きグラフを表すには、列を追加して隣接リストを使用したり、各セルにさらに情報を追加して隣接行列を使用したりできます。属性に基づいてアークをフィルタリングすると、属性なしグラフのほとんどのアルゴリズムが機能します。属性付きグラフ用に多くのアルゴリズムが開発されているため、ここではそれらについて説明しません。