不足している主な機能強化は、グラフを階層化されたグラフに変換することのようです。これは簡単な作業ではありませんが、実行可能です。(結果の品質は、プロセスに費やされた時間と考えによって異なる場合があります)。
主なアイデアは、グラフに対してある種のトポロジカルソートを実行してグラフをレイヤーに分割し、グラフ内でいくつかの配置を行ってから、グラフを描画することです。(実際のトポロジカルソートをオンラインで実行するPythonコードを見つけることができますが(例)、実際のTSは長い線のようなグラフを生成するだけなので、少し異なるものが必要です)
そこで、特定のグラフを階層化されたグラフに変換するアルゴリズムについて説明します。
トポロジカルソートはサイクルのあるグラフでは機能しないため、入力グラフがまだサイクルのない有向グラフでない場合は、循環を作成するために削除(または反転)できるエッジのセットを見つける必要があります。グラフ(後でそれらを階層化されたグラフに追加しますが、それによって階層化が中断され、グラフの見栄えが悪くなります:)。削除できるエッジの可能な限り最小のセットを見つけることはNP完全(非常に難しい)であるため、ここでいくつかのショートカットを実行する必要があり、必ずしも最小のエッジのセットを見つける必要はないと思いますが、妥当な時間内にそれを実行します。
グラフをレイヤーに分割します。ここで実行できる最適化は多数ありますが、単純にすることをお勧めします。グラフのすべての頂点を反復処理し、毎回、レイヤーへの入力エッジのないすべての頂点を収集します。これにより、単純な場合には線のようなグラフが生成される場合がありますが、UMLグラフの場合には非常に適しています。
良いグラフとは、交差するエッジの数が最も少ないグラフです。重要ではないように聞こえますが、この事実はグラフの全体的な外観に大きく影響します。交差の数を決定するのは、すべてのレイヤーのエッジの配置の順序です。ただし、交差の最小数を見つけるか、交差のない最大のエッジのセットを見つけることは、NP完全です:("したがって、これも一般的です。前のレベルでの隣接する位置の平均または中央値を見つけて、交差の数が改善される限り隣接するペアを交換することによって決定される位置に各頂点を配置するなど、ヒューリスティックに頼ります。」
アルゴリズムの最初のステップで削除された(または反転された)エッジは、元の位置に戻されます。
そして、あなたはそれを持っています!UMLに適した階層化されたグラフ。
ここでの私のコメントが何らかの形で役立つことを願っています。
重要な更新: 「信頼できるおよび/または公式のソースから描画する回答を探して
いる」と述べたので、これを添付します。「
有向グラフを描画するための4パスアルゴリズムを説明する(ドットのアルゴリズムの)graphvizからの正式なドキュメント。最初のパスは、ネットワークシンプレックスアルゴリズムを使用して最適なランク割り当てを見つけます.2番目のパスは、交差を減らすために新しい重み関数とローカル転置を組み込んだ反復ヒューリスティックによってランク内の頂点の順序を設定します.3番目のパスは、補助グラフのランク付け。4番目のパスは、エッジを描画するためのスプラインを作成します。アルゴリズムは、優れた描画を作成し、高速に実行されます。」
http://www.graphviz.org/Documentation/TSE93.pdf