我可以最小化点图中的弧长吗?

Can I minimize arc length in dot graph?

我有一个相当受限的点图,它不是我想要的。

这些图旨在表示动态贝叶斯网络并具有任意数量的时间片。我需要一个时间片中的所有节点在同一个子图中垂直排序,并且每个子图水平对齐并且最好等距。

下面是这个问题底部的代码生成的乱七八糟的 DBN - 这是一个相对简单的例子,但应该能说明问题。我希望从 't-1' 到 't' 子图和 't' 到 't+1' 子图的弧看起来相同,并避免像 'c(t-1)' 这样的循环弧到'e(t)' 并且子图也是等距的。

将 'c(t-1)' 的权重调整为 'e(t)' 没有任何作用,生成此点文件的代码应该是通用的。

如果有更好的程序可以解决这类问题,我不喜欢 dot。

生成图表的代码是:

digraph G {

    1 [ label = "a(t-1)" ];
    2 [ label = "b(t-1)" ];
    3 [ label = "c(t-1)" ];
    4 [ label = "d(t-1)" ];
    5 [ label = "e(t-1)" ];
    6 [ label = "a(t)" ];
    7 [ label = "b(t)" ];
    8 [ label = "c(t)" ];
    9 [ label = "d(t)" ];
    10 [ label = "e(t)" ];
    11 [ label = "a(t+1)" ];
    12 [ label = "b(t+1)" ];
    13 [ label = "c(t+1)" ];
    14 [ label = "d(t+1)" ];
    15 [ label = "e(t+1)" ];
    rankdir=TB

    edge[style=invis];

    {
        rank=same;
        K_1 [style=invis] ;
        K_2 [style=invis] ;
        K_3 [style=invis] ;
        K_1 -> K_2 ;
        K_2 -> K_3 ;
    }


    subgraph cluster1 {
    style=dotted ;
        1 -> 2;
        2 -> 3;
        3 -> 4;
        4 -> 5;
        label="t-1" ;
    }

    subgraph cluster2 {
    style=dotted ;
        6 -> 7;
        7 -> 8;
        8 -> 9;
        9 -> 10;
        label="t" ;
    }

    subgraph cluster3 {
    style=dotted ;
        11 -> 12;
        12 -> 13;
        13 -> 14;
        14 -> 15;
        label="t+1" ;
    }

    K_3 -> 11[style=invis] ;
    K_2 -> 6[style=invis] ;
    K_1 -> 1[style=invis] ;

    edge[constraint=false,style=solid] ;
    3 -> 10 ;

    8 -> 15 ;

}

自己找到了答案。

将排序方向更改为 LR,并在子图中使用出现顺序进行排序。

digraph G {

    rankdir=LR

    edge[style=invis];

    subgraph cluster1 {
        style=dotted ;
        rank=same ;
        K_1 [ style=invis ] ;
        1 [ label = "a(t-1)" ];
        2 [ label = "b(t-1)" ];
        3 [ label = "c(t-1)" ];
        4 [ label = "d(t-1)" ];
        5 [ label = "e(t-1)" ];
        label="t-1" ;
    }

    subgraph cluster2 {
        style=dotted ;
        rank=same ;
        K_2 [style=invis] ;
        6 [ label = "a(t)" ];
        7 [ label = "b(t)" ];
        8 [ label = "c(t)" ];
        9 [ label = "d(t)" ];
        10 [ label = "e(t)" ];
        label="t" ;
    }

    subgraph cluster3 {
        style=dotted ;
        rank=same ;
        K_3 [style=invis] ;
        11 [ label = "a(t+1)" ];
        12 [ label = "b(t+1)" ];
        13 [ label = "c(t+1)" ];
        14 [ label = "d(t+1)" ];
        15 [ label = "e(t+1)" ];
        label="t+1" ;
    }

    K_1 -> K_2 -> K_3 ;

    edge[constraint=false,style=solid] ;
    3 -> 10 ;

    8 -> 15 ;

}