グラフ・レイアウトは、一般的に、NP 完全な問題 (コンピューターの視点から簡単に解決できない問題) を解決するため、通常、ヒューリスティックを使用する複雑なタスクです。ヒューリスティックが異なれば、速度特性も異なります。通常、小さいグラフはパフォーマンスの最適化を必要としません。
一部のレイアウトは、中程度のサイズのグラフ用に設計されていますが、大規模なグラフに使用できるアルゴリズムはごく少数です。
必要な場合のみにレイアウトを使用する
グラフ・レイアウト・アルゴリズムは、通常、アプリケーションの最も複雑で遅い部分です。アプリケーションを設計する際は、グラフ・レイアウトは、慎重に、必要な場合のみ使用するようにしてください。例えば、レイアウトを起動するボタンを組み込み、レイアウトがすべてのインタラクション時に継続して実行されることがないようにします。
リンク・レイアウトなしに直交リンクを使用する
アプリケーションが直交リンク形状を必要とする場合、自動レイアウト・モードでリンク・レイアウトを使用したいと考えるかもしれません (setAutomaticLinkLayout を参照)。しかし、このモードでは、ノードが移動するたびにレイアウトが起動されます。
多数のリンクがある場合、完全自動リンク・レイアウトでは処理が遅くなる可能性があります。
代替方法として、直交形状タイプのリンクを使用する方法があります (setShapeType を参照)。このタイプの場合、リンクの交差とオーバーラップを減らすためにすべてのリンクを分析することなく、リンク形状が直交のままになることが保証されます。したがって、自動モードでリンク・レイアウトを実行するよりも、効率的になる可能性があります。
リンクに対して直交形状タイプを有効にするには、以下のいずれかを呼び出します。
link.setShapeType(ibm_ilog.diagram.LinkShapeType.Orthogonal);
link.setShapeType(ibm_ilog.diagram.LinkShapeType.OrthogonalEditable);
グラフ・サイズに適切なレイアウトを使用する
グラフ・レイアウト・アルゴリズムが異なれば、サポートするグラフのサイズも異なります。
- ツリー・レイアウトおよびグリッド・レイアウトは、大きなグラフを処理できます。
- 階層型レイアウトは、それほど多くのリンクのない中程度のサイズのグラフを処理できます。
- 力指向レイアウトは最も遅いアルゴリズムで、大きなグラフには適していません。
詳しくは、グラフ・レイアウト・アルゴリズムの速度を参照してください。
すべてのリンクを表示しない
リンクの設定された大規模なグラフがある場合、グラフのスパンニング・ツリーだけを表示して、他のリンクは非表示にすることが最善です。スパンニング・ツリーは、
ツリー・レイアウトでレイアウトすることができます。
非表示のリンクをユーザーに認識させるためにインタラクションを使用するようにアプリケーションを設計してください。
例えば、1 つのノードを選択すると、非表示または表示されるリンクにより、このノードから到達可能なすべてのノードが強調表示されるようにすることが考えられます。この方法は、すべてのリンクを同時に表示する方法よりも人間工学的に優れています。同時にあまりに多くのリンクが表示されても、ユーザーの目でたどることができないためです。
サブグラフになるようにクラスター化し、省略する
グラフには、有意義なクラスター情報が含まれることがあります。
例えば、人のグラフは、国籍または家族に従ってクラスター化することができます。各クラスターは、省略または展開可能な入れ子のサブグラフ (Subgraph) として表すことができます。
サブグラフは、省略されると、クラスター内部のコンテンツをレイアウトする必要がないため、レイアウトが速くなります。
また、関心の詳細のみが表示され、あまり関心のないサブグラフが省略されれば、ダイアグラムもわかりやすくなります。反対に、すべてのサブグラフが展開されると、サブグラフの入れ子の深さが深い場合、レイアウトが遅くなる可能性があります。アプリケーションが大きなグラフを使用する場合、注意深く設計して入れ子のサブグラフにクラスター化されるようにすれば、ユーザー・エクスペリエンスが改善されます。
グラフ・レイアウト・アルゴリズムの速度
グラフ・レイアウト・アルゴリズムの速度は、グラフのタイプ、およびレイアウト・パラメーターによって異なります。
一部のレイアウトでは、特定のタイプのグラフに対して遅くなります。
ツリー・レイアウト
ツリー・レイアウトは、自動傾斜モードを使用しない限り、高速で、大規模なグラフを処理できます。
- 「自由」および「レベル」レイアウト・モードが最速です。
- 放射レイアウト・モードは、若干遅くなりますが、それでも大きなグラフに対して十分な速度です。
- 傾斜レイアウト・モードは遅く、小さいグラフに対してのみ良好に機能します。
詳しくは、ツリー・レイアウト (TL) を参照してください。
階層型レイアウト
階層型レイアウトの速度は、グラフの濃度 (リンク数とノード数の比率) によって異なります。階層型レイアウトは、リンクがあまりない大きいグラフを処理することはできますが、多数のリンクがある小さいグラフの場合は処理が遅くなる可能性があります。
階層型レイアウト速度および品質は、制約数によっても異なります。制約が少なければ、レイアウトはノードを配置する自由度が高くなり、レイアウトは速くなります。
特に、制約の競合は、これを検出すると処理が遅くなるため、そのような競合がないようにしてください。
詳しくは、階層型レイアウト
(HL) を参照してください。
グリッド・レイアウト
グリッド・レイアウトは、高速で大きなグラフを処理できます。ただし、TILE_TO_MATRIX レイアウト・モードでは、速度はグリッド・メッシュ・サイズ (グリッド・ライン間の距離) によって異なります。グリッド・メッシュ・サイズが小さいほど、レイアウトは遅くなります。他のレイアウト・モードの場合、グリッド・メッシュ・サイズはパフォーマンスに影響しません。
詳しくは、グリッド・レイアウト (GL) を参照してください。
短および長リンク・レイアウト
リンク・レイアウトの速度は、リンク数に応じて異なります。
リンク・レイアウトは、小および中程度のサイズのグラフに適しています。グラフに多くのリンクがある場合は、リンク・レイアウトなしに直交リンクを使用するを参照してください。
長リンク・レイアウトの場合、速度はグリッド・メッシュ・サイズ (グリッド・ライン間の距離) によって異なります。
グリッド・メッシュ・サイズが小さいほど、レイアウトは遅くなります。徹底検索モード (
LongLinkLayout.setExhaustiveSearching
) は遅いので、可能であればこの徹底検索モードは避けるようにしてください。詳しくは、リンク・レイアウト (LL) を参照してください。
力指向レイアウト
このアルゴリズムでは、増分、非増分、および高速複数レベルという 3 つのオプション・モードを提供しています。
後者は、中程度および大きなグラフに対して一番速くなっています。
これらのモードについて詳しくは、力指向レイアウトのレイアウト・モードに関するレイアウト・モード
を参照してください。
サーバー・サイド・レイアウト
大きく複雑なグラフの場合、サーバー・サイド・レイアウトを使用することによりパフォーマンスを改善することができます。
サーバー・サイド・レイアウトでは、すべてのグラフ・データがサーバーに送信されて、
グラフ・レイアウトがサーバーで実行されます。この方法により処理が速くなる可能性がありますが、
以下の要因に左右されます。
- ブラウザーの JavaScript エンジンの速度。
- クライアントとサーバー間のネットワーク接続の速度。
レイアウト・カスタマイズ・インターフェース
いくつかのレイアウト・アルゴリズムは、
INodeBoxProvider
、INodeSideFilter
、または、ILinkConnectionBoxProvider
などのカスタマイズ・インターフェースをサポートしています。これらのインターフェースを使用すると、レイアウト・アルゴリズムが直接コードにジャンプします。
これらのインターフェースは、レイアウト・アルゴリズムのパフォーマンスを低下させる場合があるので、これらのインターフェースを実装する場合は注意してください。