より高いレベルのグラフを表すためにも使用できるグラフ構造を作成したいと考えています。この問題は、次の図で表すのが最も適切だと思います。
お気づきかもしれませんが、 level のグラフには level のn-1
ノードが含まれていますn
。混合グラフはありません。つまり、グラフ内のすべてのノードが同じレベルになります。
私のユース ケースのもう 1 つの側面は、ノードが基本的に単なる関数であるということです。したがって、レベル 1 グラフは機能の相互接続です (ニューラル ネットワークを考えてください)。
また、グラフの接続マトリックスがノードのプロパティではなく、独立したオブジェクトである必要があります (つまり、すべてのノードのプロパティとしてではなく、すべての接続を表すオブジェクトが必要ですNode.Next
)。
私が考えている疑似コードのアプローチは次のとおりです。
class Node<T>:
func :: T -> T //The function 'func' takes a value of type 'T' and returns another value of type 'T'.
class Network<T where T is instance of Node> inherits Node<T2>:
ConnectionMatrix<T> matrix;
override/implement func :: T2 -> T2;
//I'm applying some sort of pattern matching on types here:
type ConnectionMatrix<Network<T>> =
Dictionary<Nerwork<T>, Dictionary<Nerwork<T>, ConnectionMatrix<T>>>
type ConnectionMatrix<Node> = Dictionary<Node, Dictionary<Node, Integer>>
しかし、お分かりのように、それは不完全であり、現状では、私の知っているどの言語でも表すことができません.
動的に型付けされていない限り、実装の言語は問題になりません。
編集: 次の解決策(回答で提案されているように)は、私の設計では機能しません:
data Connection = Connection {
weight :: Double,
length :: Int
} deriving (Eq, Show)
data Graph a = Graph {
nodes :: M.Map Int a,
edges :: M.Map (Int, Int) Connection
} deriving (Eq, Show)
data Network a = Simple a | Nested (Network (Graph a))
deriving (Eq, Show)
その理由は、次のような加重グラフが必要だからです。
- 2 つのレベル 0 グラフ (つまり単純なノード) 間の接続は、上記で定義された
Connection
タイプと同じです。 - 2 つのレベル 1 グラフ間の接続はタイプになる
M.Map (Int, Int) Connection
ため、グラフのエッジはタイプになりますM.Map (Int, Int) (M.Map (Int, Int) Connection)
。これは、レベル 1 グラフの各エッジが、レベル 0 グラフの内部ノード間の一連の接続を返すことを意味します。 - 同様に、レベル n グラフの場合、接続のタイプは である必要があります
M.Map (Int, Int) <Type of connection for Level n-1 graph>
。
編集:実際には、上記の表現は私にとってはうまくいきます。エッジを縮小した形で保存するだけです。しかし、上記の条件を満たすようなプログラムを書くことは可能でしょうか?