Graphviz 点节点排序

Graphviz 点节点排序,graphviz,dot,Graphviz,Dot,我正在构建一个epsilon NFA,以使用规范结构识别正则表达式。我使用子图对正则表达式的各个部分进行分组。*操作符给我带来了特别的麻烦,因为dot决定移动节点的顺序。我尝试添加边权重,以强制特定边变短,以保持边的顺序一致,但这似乎不起作用 我想做的是强制子图中的节点按特定顺序放置,以便输出图可以识别为特定类型的(众所周知的)构造。在下面的示例中,我希望边3、4、5和6按该顺序放置,但是圆点将它们按6、3、4、5的顺序放置。欢迎指点 请注意,当前“权重”参数与“完全没有权重”参数相比不会产生任

我正在构建一个epsilon 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;
}

以下是我如何编写图表:

  • 首先,对我来说,这是一个从上到下,而不是从左到右的图,因此我删除了
    rankdir=LR
    ,只为节点0/1和节点2/3添加了
    rank=same
  • 我去掉了所有的重物
  • 最重要的是,我将
    constraint=false
    添加到与图形方向相反的边上-从节点4到节点5的边,以及从节点6到节点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];
}
结果如下:

现在,如果您愿意,您可以保留
rankdir=LR
,只需获取您发布的标记,移除权重,并将
constraint=false
添加到与我相同的边缘,它也可以工作