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;
}
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:
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.
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