私のアプリケーションでは、40〜50ノード、通常ノードあたり6未満のエッジで構成されるネットワークをモデル化して操作を実行する必要があります。ノードとエッジはどちらも、それぞれ約1Kのデータを持つオブジェクトです。実行中、ネットワークのマッピングは頻繁に変更されます-調整される個々のノードとエッジのプロパティに加えて、ノードの追加と削除、エッジの追加と削除。ノードオブジェクトとEdgeオブジェクトは、「new」を使用して割り当てられ、結果のポインタは各オブジェクトタイプのstd::list
に格納されます。
私はマッピングのために2つの異なるアプローチを試しました:
各ノードにコンテナを配置してエッジのIDを保持し、各エッジに2つの変数を配置して終了ノードのIDを格納します。
エッジのコンテナおよびノードのコンテナとは別に、新しい最上位のコンテナを追加して、マッピング情報を保存します。
ノードおよびメンバークラスの関数は、マッピング情報がこれらのクラスに格納されている場合、実装が容易になります。すべてのマッピングデータが個別に保存されている場合は、ネットワークマッピングを変更する方がはるかに簡単です。ただし、マッピングがノードとエッジに格納されていない場合、ノードとエッジのメンバー関数には、親オブジェクトからマッピング情報を取得する方法が必要です。
データを複製したり、カプセル化を壊したりすることなく、両方のアプローチのベストを提供するデータ構造または概念的なテクニックはありますか?非常にコストのかかる計算は含まれないため、パフォーマンスは大きな問題ではありません。より重要な問題は、安全で理解しやすく、保守可能なコードです。
Graphs はさまざまな方法で実装でき、概要を説明したものは間違いなく間違いありません。
C++の場合は、 Boost C++ libraries (BGL)にも目を通す必要があります。これには グラフを実装するためのライブラリ もあります。これを使用する場合、BGLで実装されたアルゴリズム(検索とトラバーサル)を使用することも、_Edge
および_vertex
直接訪問者。
Pythonでネットワーク操作を実装しました。これが私の解決策です。
Node
sのリストを所有するクラスPort
Port
オブジェクトには属性destination
、proper_direction
およびback_port
がありますNode
はリンク機能を提供し、リスト内の各Port
オブジェクトに別のバックポートがあることを保証しますPort
オブジェクトは、負のproper_direction
を使用して宛先ノードに作成されますまた、このバックポートはback_port
によって参照されますこのようにして、ノードはポートのペアによって双方向でリンクされ、proper_directionが逆になります。必要に応じてCポインタを作成します-Pythonではポインタは関係ありません;-)
各Nodeにデータを格納するには、マッピングを追加するサブクラスを派生させます。各リンクにもデータを格納する場合は、Node
オブジェクトによってリンクをエミュレートし、基本的にポートによるオブジェクトとリンク(両方のノード)のリンク。
このデータ構造は、ネットワークの検索と操作に非常に便利であることがわかりました。