Могу ли я минимизировать длину дуги в точечной диаграмме?

У меня довольно ограниченный точечный график, который выходит не так, как я хочу.

Графики предназначены для представления динамической байесовской сети и имеют произвольное количество временных интервалов. Мне нужно, чтобы все узлы в одном временном интервале были упорядочены по вертикали в одном и том же подграфе, а каждый подграф должен быть выровнен по горизонтали и предпочтительно равноудаленно.

Ниже приведен беспорядочный DBN, сгенерированный кодом в нижней части этого вопроса - это относительно простой пример, но он должен проиллюстрировать проблему. Я бы предпочел, чтобы дуги от подграфа 't-1' до 't' и подграфа от 't' до 't+1' выглядели одинаково, и избегали бы зацикливания дуг, подобных 'c(t-1)' to 'e(t)', а также имеют подграфы на равном расстоянии.

Настройка веса 'c (t-1)' на 'e (t)' ничего не делает, и код для генерации этого файла точек должен быть общим.

Я не привязан к точке, если есть лучшая программа для этого типа проблемы.

Код для генерации графика:

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 ;

}

1 ответ

Решение

Нашел ответ сам.

Изменил направление ранга на 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 ;

}
Другие вопросы по тегам