Grafviz.Dot node ordering

Buduję epsilon NFA do rozpoznawania wyrażeń regularnych przy użyciu konstrukcji kanonicznej. Używam podgrafów do grupowania różnych części wyrażenia regularnego. Operator * sprawia mi szczególne problemy, ponieważ dot zdecydował się przesunąć kolejność węzłów wokół. Próbowałem dodać wagi krawędzi, aby wymusić na poszczególnych krawędziach krótkie, aby utrzymać kolejność krawędzi w linii, ale to nie wydaje się działać.

To, co chciałbym zrobić, to wymusić węzły w podgrafie w celu umieszczenia w określonej kolejności tak, aby Wykres wyjściowy był rozpoznawalny jako szczególny typ (dobrze znany) konstrukcji. W poniższym przykładzie chciałbym, aby krawędzie 3, 4, 5 i 6 były umieszczone w tej kolejności, jednak kropka umieszcza je w kolejności 6, 3, 4, 5. Wszelkie wskazówki mile widziane.

Zauważ, że bieżący parametr wagi nie daje żadnej różnicy niż żaden parametr wagi w ogóle.

Mam następujące

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

Author: marapet, 2011-10-02

1 answers

Oto jak bym napisał ten wykres:

  • Po pierwsze, dla mnie jest to wykres, który idzie od góry do dołu, a nie od lewej do prawej, dlatego usunąłem {[1] } i dodałem rank=same tylko dla węzłów 0/1 i węzłów 2/3.
  • usunąłem wszystkie ciężarki
  • co najważniejsze, dodałem constraint=false do krawędzi idących w kierunku wykresu - jeden od węzła 4 do węzła 5, a jeden od węzła 6 do węzła 3.

Tutaj źródło:

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];
}

A oto wynik:

wyjście grafviz

Teraz, jeśli chcesz, możesz zatrzymać rankdir=LR, po prostu wziąć znaczniki, które napisałeś, usunąć ciężary i dodać constraint=false do tych samych krawędzi, co ja, to też działa.

 32
Author: marapet,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-10-02 19:34:14