Подтвердить что ты не робот

Graphviz.dot node заказ

Я создаю epsilon NFA для распознавания регулярного выражения с использованием канонической конструкции. Я использую подграфы для группировки различных частей регулярного выражения. Оператор * дает мне особые проблемы, поскольку точка решила переместить порядок узлов вокруг. Я попробовал добавить вес границ, чтобы ограничить конкретные края, чтобы сохранить порядок краев в строке, но это, похоже, не работает.

То, что я хотел бы сделать, - заставить узлы в подграфе быть помещены в конкретный порядок, чтобы выходной граф был распознан как конкретный тип (хорошо известной) конструкции. В приведенном ниже примере я хотел бы, чтобы края 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

4b9b3361

Ответ 1

Вот как я бы написал этот график:

  • Прежде всего, для меня это график, который идет сверху вниз, а не слева направо, поэтому я удалил rankdir=LR и добавил rank=same только для узлов 0/1 и узлов 2/3.
  • Я удалил все веса
  • Самое главное, я добавил constraint=false к ребрам, идущим против направления графика: тот, который идет от node 4 до node 5, а другой от node 6 до node 3.

Здесь источник:

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 на те же края, что и я, это тоже работает.