10

次のグラフを次のようにコンパイルしますdot graph.dot -Tpdf -ograph.pdf

ここに画像の説明を入力してください

結果は大丈夫ですが、状態遷移はspagetthiモンスターによく似ており、この問題に取り組むために何ができるかわかりません。他のレイアウトを試しました:twopi, neato, etc.グラフをもう少し対称的に見せるためのパラメーターはありますか?全体像は大丈夫だからです。

私には、エッジがエッジの説明をフレーム化するために利用可能な最小限のスペースを使用しているように見えますが、これが問題である可能性がありますか?

グラフのデザインに欠陥がありますか?異なる遷移を分離するために\nを使用して、1つのエッジに異なる状態遷移を書き込む必要がありますか?

digraph finite_state_machine {
    rankdir=LR;
    edge [fontsize=26];
    node [shape = doublecircle, width=2.0, fontsize=24, fixedsize=true,style=filled, colorscheme=spectral5]; New  [fillcolor=3] Terminated [fillcolor=5];
    node [shape = circle, width=2.0, fontsize=24, fixedsize=true, colorscheme=spectral5]; Runnable [fillcolor=4] Waiting [fillcolor=2] "Timed\nWaiting" [fillcolor=2] Blocked [fillcolor=1];
    New -> Runnable [ label = "Thread.start" ];
    Runnable -> Waiting [ label = "Object.wait" ];
    Runnable -> Waiting [ label = "Thread.sleep" ];
    Runnable -> Waiting [ label = "LockSupport.park" ];
    Waiting -> Blocked [ label = "Reacquire monitor lock after\nleaving Object.wait" ]
    Waiting -> Blocked [label = "Spurious wake-up"]
    "Timed\nWaiting" -> Blocked [ label = "Reaquire monitor lock after\n leaving Object.wait" ]
    "Timed\nWaiting" -> Terminated [ label = "Exception" ]
    "Timed\nWaiting" -> Blocked [ label = "Spurious wake-up" ]
    Runnable -> "Timed\nWaiting" [ label = "Object.wait" ];
    Runnable -> Blocked [ label = "Contended Monitor\nEnter" ];
    Blocked -> Runnable [ label = "Contended Monitor\nEntered" ];
    Runnable -> Terminated [ label = "Thread finishes\nexecution" ]
    Runnable -> Terminated [ label = "Exception" ]
    Waiting -> Runnable [ label = "Object.notify\nObject.notifyAll" ]
        Waiting -> Terminated [ label = "Exception" ]
    "Timed\nWaiting" -> Runnable [ label = "Object.notify\nObject.notifyAll" ]
}
4

1 に答える 1

8

あなたのデザインに欠陥はないと思います。それでいいと思います。ドット構文は読みやすいため保守が容易であり、その結果、自動生成されたグラフは通常同じように見えます。

もちろん、小さな修正を加えて、この特定のグラフをより良く (または少なくとも異なるものに) することができます。たとえば、グラフのソースがアプリケーションによって生成される場合、実装が難しいものもあります。ここにいくつかのアイデアがあります:


レイアウトをより対称的にするには、ノードWaitingTerminatedおよびTimed WaitingBlockedgroupの属性を同じ値 (group=aと) に設定して整列させてみてくださいgroup=b

グループ化されたノード

WaitingとTeminatedでは問題なく機能しましたが、Timed WaitingBlockedではうまく機能しませんでした。おそらく、これらのノード間に 2 つのエッジがあるためです。

weightそれらをリンクするエッジの 1 つを選択し、その属性を高い値に設定して、それらをまっすぐにしようとする場合があります。

それ以外は、特にRunnableWaitingの間だけでなく、エッジが滑らかで不要な曲線が少ないため、グラフは全体的に見栄えが良いと思います。


スパゲッティ効果はスプラインによるものです。スプラインがないとスパゲッティに見えないのでしょうか? splines=compoundorを追加してみましたsplines=ortho(同じ結果):

グループと化合物

グラフが使用する垂直方向のスペースがわずかに少なくなります。スパゲッティではありませんが、私の意見では良くありません...


グループ属性なしで試すこともできsplines=compoundます。これにより、グラフがもう少しコンパクトになります (バグは必ずしもきれいではありません)。または、エッジの重さをいじって、特に不快なエッジをまっすぐにします。

場合によっては、concentrate多数の平行なエッジを持つグラフをクリアできますが、この場合はあまり役に立ちません。

于 2011-07-16T00:33:02.613 に答える