web-dev-qa-db-ja.com

Graphviz .dotノードの順序

正規構造を使用して正規表現を認識するイプシロンNFAを構築しています。正規表現のさまざまな部分をグループ化するためにサブグラフを使用しています。 *演算子は、dotがノードの順序を移動することにしたため、特に問題を引き起こしています。エッジの重みを追加して、特定のエッジを短くして、エッジの順序を揃えようとしましたが、機能していないようです。

私がしたいのは、出力グラフが特定のタイプの(よく知られている)構造として認識できるように、サブグラフのノードを特定の順序で配置することです。以下の例では、エッジ3、4、5、6をこの順序で配置したいと思いますが、ドットはそれらを6、3、4、5の順序で配置します。

現在の加重パラメータは、加重パラメータがない場合よりも差が出ないことに注意してください。

私は以下を持っています

digraph G {
    rankdir = LR;
    node [shape = none];
            0 [label = "start"];
    node [shape = circle];
            1 [label = "q1"];
            2 [label = "q2"];
            3 [label = "q3"];
            4 [label = "q4"];
            5 [label = "q5"];
    node [shape = doublecircle];
            6 [label = "q6"];
    subgraph re1 {
            rank = same;
            Edge[label = "0"];
            1 -> 2;
    };
    subgraph re2 {
            rank = same;
            Edge[label = "ε"];
                    3 -> 4 [weight = 10];
            Edge[label = "1"];
                    4 -> 5 [weight = 10];
            Edge[label = "ε"];
                    5 -> 6 [weight = 10];
                    5 -> 4 [weight = 1];
                    6 -> 3 [weight = 1];
    };
    Edge[color=black];
            0 -> 1
    Edge[label = "ε"];
            2 -> 3;
}

graphiz output

29
Michael Conlen

これが私がそのグラフを書く方法です:

  • まず第一に、これは左から右ではなく上から下に行くグラフなので、rankdir=LRを削除し、ノード0/1およびノー​​ド2/3に対してのみrank=sameを追加しました。
  • すべてのウェイトを外しました
  • 最も重要なのは、グラフの方向に逆行するエッジ(ノード4からノード5へ、およびノー​​ド6からノード3へのエッジ)にconstraint=falseを追加したことです。

ここにソース:

digraph G {
    0 [label = "start", shape = none]; 
    node [shape = circle];
    1 [label = "q1"];
    2 [label = "q2"];
    3 [label = "q3"];
    4 [label = "q4"];
    5 [label = "q5"];
    6 [label = "q6", shape = doublecircle];

    {rank = same; 0 -> 1; }
    1 -> 2 [label = "0"];
    {rank = same; 2 -> 3 [label = "ε"]; }
    4 -> 5 [label = "1"];
    Edge [label = "ε"];
    3 -> 4;
    5 -> 6;
    5 -> 4 [constraint = false];
    6 -> 3 [constraint = false];
}

そしてここに結果があります:

graphviz output

必要に応じて、rankdir=LRを保持し、投稿したマークアップを取り、重みを削除し、constraint=falseを私と同じエッジに追加するだけでうまくいきます。

34
marapet