0

force-directed graphを最適化しようとしています。これまでのところ、単純な O(n 2 ) メソッドを使用して実装しました。約 1000 ノードしか処理できませんが、これは私のニーズには少なすぎます。

ここに画像の説明を入力

このアルゴリズムに精通している方は、アルゴリズムに 2 つの主要な要素があることをご存じでしょう。クーロンの法則によるノード間の反発と、フックの法則を使用したエッジに沿ったばねのような引力です。これらの要素はどちらも、ノード間のペアワイズ計算を伴います。

Barnes-Hut アルゴリズムは、反発成分を O(n log n) にする前者に対してうまく機能します。しかし、私はスプリングコンポーネントに似たものを見つけることができませんでした. 私は次のことを検討しました:

  1. 位置に基づいてノードを重複するビンに分割し、同じビン内のノード間でのみペアワイズ計算を実行します。ただし、特にノードの初期構成はランダムであり、接続されたノードはどこにでもある可能性があるため、これはすべての場合に機能するとは限りません。ノードの生成方法を変更することはできますが、それらがすべて同じビンにない限り、依然として不正確な結果が生成されます。

  2. エッジを別々に保存し、それらを繰り返し処理してばね力を計算します。今のところ、これは私にとって最も有望な方法のようです。

私が考えていないより良い方法はありますか?それが問題である場合、私は C# を使用しています。並列ループをスローするのが簡単だったらいいのにと思います。

4

3 に答える 3

0

私があなたを正しく理解していれば、反発成分には O(n log n) があり、引力成分はまばらです。ノードごとに、平均して k << n のバネのような引力があります。その場合、隣接行列の代わりに隣接リストに魅力を格納することで、O(n * k) の魅力コンポーネントを処理できます。

于 2013-09-25T16:41:18.383 に答える
0

あなたが与えた2番目のオプションは、エッジの数に関して線形の複雑さで機能するはずだと思います。それらを反復して、それぞれの 2 つのノードで合力を更新し続けます。

編集:申し訳ありませんが、以前は各ノードがスプリングを介して他のすべてのノードに接続されていると考えていました。

于 2013-09-25T14:23:29.373 に答える